一、题目:
给定一个十进制的正整数,写下从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; }
四 截图
五 总结
这题的关键是找规律,要把数字进行拆分,每个位上的数都和该数的高低位数有关系,做这种题就要多写几个数,找到规律就容易了。