题目:
给定一个十进制的正整数,写下从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;
}
截图:

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