计算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)+100)10
0-999 1的个数 pow(10,2)+(pow(10,1)+(pow(10,0)+100)10)10
然后从右到左一次计算1出现的个数,例如21345,
5:1;
4:10 + 41;
3:100 + 320;
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);
}
}