一、实验题目
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数出其中1的个数。
要求:
1、写一个函数F(N),返回1~N之间出现“1”的个数,例如:F(12)=5;
2、在32位整数范围内,满足条件的“F(N)=n”的最大的N是多少;
二、设计思路
规律:
每一位上都只有三种情况:0,1,2-9
第 i 位(个位算作第0位,十位算作第1位。。。。。):
0: Num/(10^(i+1))*(10^i)
1: Num/(10^(i+1))*(10^i)+Num%(10^i)+1;
2-9: (Num/(10^(i+1))+1)*(10^i)
三、核心源代码
1 #include<iostream.h> 2 #include<math.h> 3 4 int shu1(int num) 5 { 6 int flog=1;//标记计数1的位数(1为个位,10为十位) 7 int now=0;//当前位数 8 int low=0;//较低位数 9 int high=0;//较高位数 10 int count=0; 11 12 while(num/flog!=0) 13 { 14 now=(num/flog)%10; 15 low=num-(num/flog*flog); 16 high=num/(flog*10); 17 if(num<=0) 18 return 0; 19 if(0==now)//当前数字为0时计数 20 { 21 count+=high*flog; 22 } 23 else if(1==now)//当前数字为1时计数 24 { 25 count+=high*flog+low+1; 26 } 27 else 28 { 29 count+=(high+1)*flog; 30 } 31 flog=flog*10;//数字左移一位 32 } 33 return count; 34 } 35 void main() 36 { 37 int num; 38 int max=0; 39 cout<<"请输入要测试的数值:"; 40 cin>>num; 41 cout<<"出现“1”的个数为:"<<shu1(num)<<endl; 42 }
四、程序截图:
五、实验总结
在本次试验中,最主要的还是找到数“1”游戏中的规律,找到规律之后,代码程序也就豁然开朗了。
时间: 2024-10-11 02:15:36