一、题目:
给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。要求:
1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数。例如 f(12) = 5。
2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
二 思路
总体是寻找各个位置上1的个数。首先需要把数字进行拆分,这是有三种情况需要考虑,即等于0,等于1,和大于1;比如有一数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的个数。
三代码
#include <iostream>
using namespace std;
int CN(int n)
{
int c=0;
int f=1;
int LN=0;
int CurN=0;
int HN=0;
while (n/f!=0)
{
LN=n-(n/f)*f;
CurN=(n/f)%10;
HN=n/(f*10);
if(CurN==0)
c=c+HN*f;
else if(CurN==1)
c=c+HN*f + LN +1;
else
c=c+(HN+1)*f;
f=f*10;
}
return c;
}
int main()
{
int n,i,k;
cout<<"请输入数字:"<<endl;
cin>>n;
cout<<n<<"中出现数字1的个数为:";
cout<<CN(n)<<endl;
cout<<"1的个数与值相同的数有:"<<endl;
for(i=1;i<214648596;i++)
{ k=CN(i);
if(k==i)
cout<<i<<endl;
}
return 0;
}
四 截图
五 总结
这题的关键是找规律,要把数字进行拆分,每个位上的数都和该数的高低位数有关系,做这种题就要多写几个数,找到规律就容易了。