算法: 整数中 1 出现的次数

问题

  • 输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
    例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

解决


//1、打标法(数学归纳),通过某一位上面的规律推广到所有位
class Solution {
    public int countDigitOne(int n) {
        int cin=0;     // 1出现的次数

                //每10个数之间,个位上只出现1个1
                //每100个数之间,十位上只出现10个1
                //每1000个数之间,百位上只出现100个1

                // 每一位上面出现1的个数是前一个位/10

                //以1000上面百位的1为例 找出规律 ,k=100,n为输入数字
               // (n/1000)*100+Math.min(Math.max(n%(1000)-100+1,0),100);

        long mulk=1;    // 进位操作
        for(int k=0;mulk<=n;++k){
            cin+=(n/(mulk*10))*mulk+Math.min(Math.max(n%(mulk*10)-mulk+1,0),mulk);
            mulk*=10;
        }

        return cin;
    }
}


posted @ 2022-08-10 22:42  new_monkey  阅读(83)  评论(0)    收藏  举报