整数1出现的次数

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

时间限制:1秒 空间限制:32768K

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
    
    }
}

解题思路

分析:假如以数字625来讨论,每一位上的值记为value
(1)个位:
从1到n,每九次一循环(0-9),其出现的周期数与其高位有关。
n=625中,个位数(记为p=5)中1出现的次数为:
count= 62 + 1 = n/10+ p==0?0:1 = 63

(2)十位:
十位的变化也是0-9一轮回,因此十位出现一次1,那么个位可以从0-9变化,其次数为10。
如果n=605,那么count=6*10=60,此时十位数p=0
如果n=615,那么count=6*10+5+1=66,此时十位数p=1,个位数为5
n=625中,十位数(记为p=2)中1出现的次数为:
count= 6*10 + 10=60
因此,只有p!=1的时候需要考虑个位数

(3)其他位
方法同十位数

代码实现

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int p;
        int count=0,base=1,tmp=n;
        while(tmp!=0){
            p=tmp%10;//p用于记录当前位(个位、十位、...)
            tmp/=10;//tmp/10后用于记录其高位
            count+=tmp*base;
            if(p==1) count+=n%base+1;
            else if(p>1) count+=base;
            base*=10;
        }
        return count;
    }
}

你可能感兴趣的:(整数1出现的次数)