求出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;
}
}