软件工程课堂练习--找“一”
一、题目要求
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数
要求:
1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少
二、设计思路
通过列举,不难发现有如下规律
1.一位十进制数:当N>=1时,f(N)=1;当N=0时,f(N)= 0;
2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4=6;
f(23)=个位出现1的个数+十位出现1的个数=3+10=13;
......
f(93)=个位出现1的个数+十位出现1的个数=10+10=20;
3.三位十进制数:f(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=(10+10)*1+(3+10)+24=57;
f(199)=...=(10+10)*2+100;
f(203)=...=(10+10)*2+1+100;
f(213)=...=(10+10)*2+(2+4)+100;
......
f(303)=...=(10+10)*3+(1)+100;
......
4.f(abcde),计算c位上的1的个数,需要看ab、c、de的情况:
当c=0时,受高位影响,百位上出现1的个数为:(ab)*100;
当c=1时,受高位和低位影响,百位上出现1的个数为:(ab)*100+((cde)+1);
当c>1时,受高位影响,百位上出现1的个数为:((ab)+1)*100;
三、程序部分代码
一下为计算1出现次数的部分代码
1 while (n/factor!=0) 2 { 3 LowerNum=n-(n/factor)*factor; 4 CurNum=(n/factor)%10; 5 HigherNum=n/(factor*10); 6 switch (CurNum) 7 { 8 case 0: 9 count=count+HigherNum*factor; 10 break; 11 case 1: 12 count=count+HigherNum*factor + LowerNum +1; 13 break; 14 default: 15 count=count+(HigherNum+1)*factor; 16 break; 17 } 18 factor=factor*10; 19 } 20 return count; 21 }
四、截图
五、实验总结
根据老师的提示将数字分开看,分别看个位和十位..中“1”出现的次数,依次列举出来,很容易的就能找到规律