• 31.整数中1出现的次数


    题目描述:

      求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1
    到 n 中1出现的次数)。

    思路分析:

      个位上每隔10个数出现一个1,如1,11,21等等,我们就以10为分隔阶梯,每一个完整的阶梯中都有一个1.例如数字22,在完整阶梯0-9,10-19中都有一个1.但是19后面有一个不完整的阶梯,我们需要判断这个阶梯中会不会有1,如果这个露出来的数大于等于1,那么就有一个1,否则0个。那么个位数上1的个数为:

      n/10*1+(n%10!=0?1:0)

      十位上出现1就是10-19这组数,这组数每隔100会出现一次,所以这次阶梯为100,例如数字321,有0-99,100-199,200-299,三个完整的阶梯,露出来的数是21,如果露出来的数小于10,那么十位数为1的个数就为0,如果露出来的数大于等于19那么十位为1的个数就是10个,要是小于19,那十位为1的个数就为k-10+1个。那么十位数上为1的个数是:

      n/100*10+if(n%100>19) 10 if(n%100<10) 0 if(n%100>10&&n%100<19) k-10+1

      百位上出现1就是100-199这组数,这组数每隔1000会出现一次,所以这次阶梯为1000,例如数字3321,有0-999,1000-1999,2000-2999,这三个完整的阶梯,露出来的数是321,如果露出来的数小于100,那么百位为1的个数就为0,如果大于199,那么百位为1的个数就是100个,要是在100到199之间就是k-100+1个。那么百位数上为1的个数是:

      n/1000*100+if(n%1000>199) 100 if(n%100<100) 0 if(n%100>100&&n%100<199) k-100+1

      因此给一个数n,1-n中1的个数为:(n/(i10))i+(if(k > i * 2 - 1) i else if(k < i) 0 else k - i + 1) k=n%(10*i)

    代码:

    public class Solution {
        public int NumberOf1Between1AndN_Solution(int n) {
            if(n<1)
                return 0;
            int count=0;
            for(int i=1;i<=n;i=i*10){
                int k=n%(i*10);   //露出来的数
                if(k>2*i-1){
                    count=count+(n/(i*10))*i+i;
                }else if(k<i){
                    count=count+(n/(i*10))*i+0;
                }else{
                    count=count+(n/(i*10))*i+(k-i+1);
                }
            }
            return count;
        
        }
    }
    
  • 相关阅读:
    scala之伴生对象的继承
    scala之伴生对象说明
    “Failed to install the following Android SDK packages as some licences have not been accepted” 错误
    PATH 环境变量重复问题解决
    Ubuntu 18.04 配置java环境
    JDBC的基本使用2
    DCL的基本语法(授权)
    ZJNU 1374
    ZJNU 2184
    ZJNU 1334
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10797571.html
Copyright © 2020-2023  润新知