• 找“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;
    }
    

      四 截图

    五 总结

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

  • 相关阅读:
    ecshop ajax请求验证captcha(验证码)
    ecshop ajax内置函数Ajax.call
    Execl中函数使用总结
    php应用篇 PHPMailer使用
    Jquery中的选择器
    你的水桶有多满
    在纸上写todo list还是用APP?
    absolute居中
    搬家租房总结
    编译器的作用:将汇编语言翻译成机器语言
  • 原文地址:https://www.cnblogs.com/bingoing/p/4549563.html
Copyright © 2020-2023  润新知