找“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;
}
四 截图

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