题目要求:
给定一个十进制的正整数,写下从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
二、程序代码
#include "stdafx.h" #include<iostream.h> #include "stdlib.h" int CountNum(int n) { int count=0; int factor=1; int LowerNum=0; int CurNum=0; int HigherNum=0; while (n/factor!=0) { LowerNum=n-(n/factor)*factor; CurNum=(n/factor)%10; HigherNum=n/(factor*10); switch (CurNum) { case 0: count=count+HigherNum*factor; break; case 1: count=count+HigherNum*factor + LowerNum +1; break; default: count=count+(HigherNum+1)*factor; break; } factor=factor*10; } return count; } int main() { int num; cout<<"请输入数字:\n"; cin>>num; cout<<"\n"; cout<<num<<"中出现数字1的个数为:\n"; cout<<CountNum(num)<<endl; return 0; }
三、结果截图
![](https://i-blog.csdnimg.cn/blog_migrate/8002b5d6c32411a24d5526e99db178f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fff47d03cc7d6f6ab965cb6b92b816d4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/398302573c749e1d5622312618c99bf1.png)
四、心得体会
在课上一开始拿到这个题目,第一反应想的就是找规律,通过举一些例子,特殊数字来观察,但是一开始的时候由于数太多,自己计算的时候出现了错误,很混乱,后来经过老师讲解和同学讨论,找到规律的方向,心平气和的再去计算,这才找出它的规律,像这种找规律的算法,必定要心平气和,不能暴躁,更不能放弃。