计算1-n之间1的个数

求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
找规律题,
0-9 1的个数,pow(10,0)+100
0-99 1的个数 pow(10,1)+(pow(10,0)+10
0)10
0-999 1的个数 pow(10,2)+(pow(10,1)+(pow(10,0)+10
0)10)10
然后从右到左一次计算1出现的个数,例如21345,
5:1;
4:10 + 41;
3:100 + 3
20;
1:345+100+1(2010);
2:10000+2((2010+100)* 10 + 1000));
1为特殊情况,如果为21345,不考虑万位,则千位为1,只有345个,那么计算0-999的1的个数即可。

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int level = 1,count = 0;
        int num = n;
        while(n>0){
            int p = n%10;
            if(p > 1){
               count += chen(level-1) * p + (int)Math.pow(10,level-1);
            }else if(p==1){
                count += chen(level-1)+(level == 1?1:1+num%((int)Math.pow(10,level-1)));
            }
            level++;
            n = n / 10;
        }
        return count;
    }
    int chen(int level){
        if(level == 0)    return 0;
        return 10*chen(level-1)+(int)Math.pow(10,level-1);
    }
}
posted @ 2019-06-14 17:49  御心飞行  阅读(569)  评论(0编辑  收藏  举报