zoukankan      html  css  js  c++  java
  • 找"1"

    题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的次数。

    要求:1.写一个函数f(N),返回1到N之间出现“1”的个数。例如f(12)=5。

            2.在32位整数范围内,满足条件的f(N)=N的最大N是多少。

    #include<iostream>
    using namespace std;
    
    int search(int n)
    {
        int a,m=10,k,x;
        
        x=0;
        k=n;
        do
        {
            a=k%10;
    
            if(a>1&&a<=9)
                x=x+(n/m+1)*m/10;
            else if(a==1)
                x=x+(n/m)*m/10+n%(m/10)+1;
            else if(a==0)
                x=x+(n/m)*m/10;
    
            m=m*10;
            k=(k-a)/10;
        }
        while(m<=(n*10));
    
        return x;
    }
    void main()
    {
        int n,x,y,k;
    
        cout<<"输入一个整数:"<<endl;
        cin>>n;
    
        k=search(n);
        cout<<n<<"以内有"<<k<<"个1."<<endl;
    
        do
        {
            n++;
            y=search(n);
        }
        while(y==k);
    
        cout<<"含有"<<k<<"个1的最大整数为:"<<n-1<<endl;
        
    }

     

    思路:一1,个整数内有几个1和它每一位的数有关,即要判断个位,十位,百位各有多少个1。比如123这个数,它个位是3>1,那么这个数个位上就有1,11,21,31....121,

    一共有13个“1”,十位是2>1,有10,11,12,13.....19;110,111,112.....119,一共20个“1”。百位是1,一共有100.....123,一共24个“1”。多列举几个数可以发现,每一位上分为三种情况:2~9,0和1;只要分别处理就行。

    2~9:个位有(N/10+1)*1个;十位有(N/100+1)*10个,百位有(N/1000+1)*100个.......

    1:个位有(N/10)*1+1个,十位有(N/100)*10+(N%10)+1个,百位有(N/1000)*100+(N%100)+1个....

    0:有N/10个

    感悟:一开始一直没有发现规律,一直做不出来,知道自己思路不对想改变思路,但还是会想着想着想回原来的思路,结果更乱了,心情也会烦躁。最后是睡了一觉,醒了之后就做出来了,不过可能还是可以优化。这次最大的感悟就是当发现自己思路不对时,不妨休息一下或与别人讨论讨论,自己硬想有时候只是浪费时间,钻牛角尖。当发现自己走进误区时一定要想办法走出来,而不是一味坚持己见。

  • 相关阅读:
    NoSuchMethodError 一般是jar包冲突了
    联通网络环境上无法访问http://repo1.maven.org/maven2/中央库解决,镜像库添加
    实现MySQL数据库的实时备份
    海外支付:遍布全球的Paypal
    .Net分布式缓存应用实例:Couchbase
    海外支付:抵御信用卡欺诈的CyberSource
    那些年,我们开发的接口之:QQ登录(OAuth2.0)
    ES6知识整理(一)--- let/const/箭头函数
    webpack 热更新(实施同步刷新)
    Vue状态管理vuex
  • 原文地址:https://www.cnblogs.com/xiaowumao/p/4554987.html
Copyright © 2011-2022 走看看