一、题目要求:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二、解决思路
通过列举几个数进行计算,可以发现函数f(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(103)=个位出现1的个数+十位出现1的个数+百位出现1的个数=(10+10)+1+100;
f(203)=...=(10+10)*2+1+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 #include "iostream.h" 2 #include "stdlib.h" 3 int CountNum(int n) 4 { 5 int count=0; 6 int factor=1; 7 int LowerNum=0; 8 int CurNum=0; 9 int HigherNum=0;10 while (n/factor!=0) 11 {12 LowerNum=n-(n/factor)*factor;13 CurNum=(n/factor)%10;14 HigherNum=n/(factor*10);15 switch (CurNum)16 {17 case 0:18 count=count+HigherNum*factor;19 break;20 case 1:21 count=count+HigherNum*factor + LowerNum +1;22 break;23 default:24 count=count+(HigherNum+1)*factor;25 break;26 }27 factor=factor*10;28 }29 return count;30 }31 32 int main()33 {34 int num;35 cout<<"请输入数字:\n";36 cin>>num;37 cout<<"\n";38 cout<<<"中出现数字1的个数为:\n";39 cout< <
四、代码截图
五、实验心得
当我们拿到看似没有思路的问题时,可以列举一下有代表性的数,从中找取规律,比如这次实验中,看似无从下手,但是当我们把每个阶段的数据列举出来时,便可以找到其中的规律。