C语言II博客作业01

| 这个作业属于哪个课程 | <班级的链接> |
| c语言程序设计 |https://edu.cnblogs.com/campus/zswxy/CST2020-3 |
| 这个作业要求在哪里|https://edu.cnblogs.com/campus/zswxy/CST2020-3/homework/11768 |
| 这个作业的目标 | <回顾数据类型以及上个学期所学习的目标> |
| 学号 | 20209016 |

一、本周教学内容&目标

第6章 回顾数据类型和表达式,第12章 文件

二、本周作业(总分:50分)

1.1 题目:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。
例如:

N=2,写下1,2。这样只出现了1个”1“。

N=12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12。这样,1的个数是5。

1.2代码图片

1.3解题思路

解法一

1位数的情况

大于1的时候有1个小于1的时候没有

2位数的情况

根据题目所给的测试值可以分析,个位数出现的次数不仅与个位数有关还与十位数有关.
如果个位数大于等于1,那么个位数出现1的次数为十位数加1。例如2,那么个位数只出现了一次1,如果13那么个位数上有1的数字是1和11,等于十位数加1.即1+1=2.例如24,个位数上有1的数字为1,11,21,即2+1=3。归纳所得如果个位数大于等于1,那么个位数出现1的次数为十位数加1。
如果个位数的数字是0,那l么个位数1出现的次数等于十位数字,例如0,个位数1出现的次数等于十位数字即为0,例如20,个位数出现1的数字为1和11,即2=2,同理可得个位数1出现的次数等于十位数字。
而十位数出现1的次数不仅和十位数有关还与个位数有关;如果十位数为1那么十位数上出现1的次数等于个位数加1,例如14,十位数有1的数字为,10,11,12,13,14等于4+1=5.假如十位数大于1,则十位数上出现1的次数为10.

3位数及其以上的情况

假设我们要计算百位上1出现的次数,百位上出现1的次数由三部分决定,百位上的数字,百位的数字,百位下的数字。如果百位上的数字为0,则百位上出现1的次数由更高位决定,例如11019,百位上1出现的情况为100~199,1100~1190,2100~2199.....10100~10199,共1100,等于更高位数字乘以当前位数即11*100=1100个。
如果百位数上的数字大于1,那么百位数上出现1的数字仅仅由高位组成,例如12214,百位出现1的情况为100~199,1100~1190,2100~2199.....11100~11199,121100~12199共1300个等于更高位的数字加1乘以当前位数,即(12+1)*100.
如果如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,出现1的情况是12100~12113,共114个,等于低位数字113+1。

解法二

  将n的每一位单独拿出来讨论,每一位的值记作weight。

个位

 从1到n,每增加1,weight就会加1,当weight加到9时又会从0开始。那么weight这样的循环会出现多少次呢,这取决于高位的数字。例如324,在从1增长到n的过程,weight将循环32次从0~9的过程,每一轮变化中1在个位出现了1次,所以一共在个位出现了32次。
 继续看weight的值,weight值为4 ,大于0,说明第32轮变化是0~4,1又出现了一次,我们记1出现的次数为count,所以count=round+1=32+1=33,round为除个位以外更高的位数上的数字。如果此时weight为0,即n=320,说明第33轮到0就停止了,那么count=round=32

十位

 对于十位数来说,其0~9的周期的出现次数与个位的统计方式x是一样的,不同点在于,从1到n,每增加10,十位的weight才会增加1,所以在十位上一轮0~9的周期,1会出现十次,即round*10。例如324,十位上出现1的情况为10,11,12....110,111,112....210,211...219,一共出现了30次  ,即round*10=3*10=30.继续观察weight的值,,当此时weight的值大于3,大于1,则说明第4轮出现了10次1,则:count=round*10+10=30+10=40.如果此时weight的值为0,说明第四轮就停止了,即count=round*10=30.

如果此时weight为1,即314,那么此时十位数上的1,此时十位数上1与个位数有关,个位数为k,第四轮就出现k+1次,即310,311,312,313,314等于五个等于个位数上的数字4+1,我们将个位数上的数字记作former,则:count=round*10+former+1=35.

更高位

与十位的计算方法一致。
归纳总结
将n分为个位和其他位
对于个位来说;
如果个位等于0 ,1出现的次数round1,例如32,个位出现1的次数为3,332,个位出现1的次数为33,4432,个位出现1的次数为443。
如果个位大于0, 1出现的次数round
1+1。
对于其他位来说,记每一位的权值为base,位值为weight,该位之前的数为former,
若weight为0,则1出现的次数为roundbase
若weight为1,则1出现的次数为round
base+1
若weight大于1,则1出现的次数为roundbase+base
534 = (个位1出现次数)+(十位1出现次数)+(百位1出现次数)=(53
1+1)+(510+10)+(0100+100)= 214
530 = (531)+(510+10)+(0100+100) = 213
504 = (50
1+1)+(510)+(0100+100) = 201
514 = (511+1)+(510+4+1)+(0100+100) = 207
10 = (1
1)+(0*10+0+1) = 2
tips
如何求这个数的位数

用此数除以10可以丢掉这个数的个位,循环除10多次直到结果为0,统计循环次数同时可以统计每个位的位值

1.4测试数据

1.5代码改进
中间得到每一位上的值过于繁琐,求weight的方法不够简便,例如13456,13456%10=6,13456/10%10=5,13456/10/10%10=4。可以用此方法改进代码的繁琐求位值,可以缩短运算时间。

2.3 用自己的语言回答两个问题,并给出所查阅资料的引用(10分)

1.什么是文件缓冲系统?工作原理如何?
系统自动为正在使用的文件开辟一个“空间”,可以一次性将文件内的数据输入到‘空间’,再从”空间“逐个输出变量即为文件缓冲系统
工作原理,

2.什么是文本文件和二进制文件
从文件编码的bai方式来看,文件du可分为ASCII码文件和二进制制码dao文件两种。
ASCII文件也称为文本zhuan文件,这种shu文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。
二进制文件是按二进制的编码方式来存放文件的。

2.4 请给出本周学习总结(15分)

1 学习进度条(5分)

日期 代码行数 学习内容
3.1-3.5 144 数据的存储和基本的数据类型
2 累积代码行和博客字数(5分)

3 学习内容总结和感悟(5分)

这道题运用了严密的数学逻辑推理,从1-10,10-100,再100之后的统计,运用了归纳推理方法,统计1出现的次数可用累加法,将多次的结果累计起来得出结果。中写代码过程中有很多细节要处理好,要正确使用while,if等循环语句,还要正确的使用嵌套结构。还有要注意数据的存储和基本的数据类型。

posted @ 2021-03-05 18:55  滢滢从不回头  阅读(123)  评论(0编辑  收藏  举报