题目:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
思路:
这道题目存在者一些规律:
f(0)=0;f(1)=1;f(2-9)=1;
f(10)=1+(0+1)=2;
f(11)=(1+1)+(1+1)=4;
f(13)=(1+1)+(3+1)=6;
f(23)=(2+1)+10=13;
f(33)=(3+1)+10=14;
f(93)=(9+1)+10=20;
f(123)=个位出现的1数+十位出现的1数+百位出现的1数
当N = abcde时
以c位为例
if(c==0) num=ab*100;
if(c==1) num=ab*100+de+1;
if(c>1) num=(ab+1)*100
代码:
#include <iostream> using namespace std; int main() { int n; cout<<"请输入数字:"; cin>>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); if(CurNum==0) count=count+HigherNum*factor; if(CurNum==1) count=count+HigherNum*factor + LowerNum +1; if(CurNum>1) count=count+(HigherNum+1)*factor; factor=factor*10; } cout<<"出现数字1的个数为:"<<count<<endl; return 0; }
截图:

总结:
一些题目总存在一些的规律,我们在遇到问题时应多多总结寻找题目中的规律,多列举一些有代表的数从中找到规律在推广到一般,解决问题。