找“1”的个数

一、题目:

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

  四 截图

五 总结

   这题的关键是找规律,要把数字进行拆分,每个位上的数都和该数的高低位数有关系,做这种题就要多写几个数,找到规律就容易了。

原文地址:https://www.cnblogs.com/bingoing/p/4549563.html