求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
题目很熟悉,统计一个整数n他的 从1到n中出现1的次数,应该是以前打acm的时候做过(但是还是想了很久。。)
先找找规律,发现
个位 每十个数 会有一个1
十位 每一百个数 会有10个1(出现在10~19)
百位 每一千个数 会出现100个1(出现在100~199)
。。。。。
于是我们只需要看n里面有多少个10多少个100多少个1000.。。就行了,然后注意下余数的处理。
比较关键的地方就是对余数的判断吧,比如2200 在/1000之后,得2....200 这个200大于了199 所以也得算上100个1,那么用于比较的这个199,我写的是 1000/10*2-1来算的。
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count = 10;
int num = 0;
while(true){
if(n / count > 0){
int chushu = n / count;
int yushu = n % count;
num += chushu*count/10;
if(yushu > (count/10)*2-1){
num+= count/10;
}else if(yushu >= count/10){
num+= yushu-(count/10)+1;
}
}
else{
int yushu = n % count;
if(yushu > (count/10)*2-1){
num+= count/10;
}else{
num+= yushu-(count/10)+1;
}
break;
}
count*=10;
}
return num;
}
}
/*
233
233/10 = 23 23个10余3 说明包含了23+1个1
233/100 = 2 . 33 包含2个10~19 这是20个,余33》19 再加10个 就是30
233/100 = 0 ....233 > 199 - 100 +1 =100个
如果余数>count/10*2-1
8
8/10 = 0 余 8
8 > 10/10*2-1
num += 1
42
42 / 10 = 4 余2
num+=4*1
2>1
num+1
42 / 100 = 0 余 42
42 > 19
num+10
1
1/10 = 0 ....1
10000 / 10
=1000 ...0
num + 1000
10000/100
=100 ....0
num + 100*10 =2000
10000/1000 = 10 ...0
num + 10*100 = 3000
10000/10000 = 1
num+= 1000 = 40000
10000/100000 =0 ....10000
5100
*/