题目要求:
给定一个十进制的正整数,写下从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(123)=个位出现1的个数+十位出现1的个数+百位出现1的个数=13+20+24=57;
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.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include6 #include "stdlib.h" 7 int count(int n) 8 { 9 int count=0; 10 int factor=1; 11 int LowerNum=0;12 int CurNum=0;13 int HigherNum=0;14 while (n/factor!=0) 15 {16 LowerNum=n-(n/factor)*factor;17 CurNum=(n/factor)%10;18 HigherNum=n/(factor*10);19 switch (CurNum)20 {21 case 0:22 count=count+HigherNum*factor;23 break;24 case 1:25 count=count+HigherNum*factor + LowerNum +1;26 break;27 default:28 count=count+(HigherNum+1)*factor;29 break;30 }31 factor=factor*10;32 }33 return count;34 }35 36 int main()37 {38 int num;39 cout<<"请输入数字:\n";40 cin>>num;41 cout<<"\n";42 cout< <<"出现数字1的个数为:\n";43 cout< <
三、运行结果截图
四、总结与心得
本次实验的题目是找1的个数,完成时设计思路花费的时间比较长,主要是用于总结规律,对于这种偏于数学应用方面的题目,只要找到规律,那么所有问题都不再困难。这也给我们提示,在我们平时解决问题时,一定要多加思考,这样才能事半功倍。