题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?
为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。
ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
解题思路
假设所求的区间位[n,m],1的个数为count,可以将区间改写为[1,m]-[1,n],那么求得count = count_m - count_n
解析编程之美上给出的求[1,n]区间内1出现的次数的数学规律如下:
根据输入数字的位数划分区间:
如果i位上的数字为0,那么从这一位上产生的1的个数sum_i = (更高位的数字)*当前位数的权重
如果i为上的数字为1,那么从这一位上产生的1的个数sum_i =(更高位的数字)*当前位数的权重+(低位数字+1)
如果i位上的数字大于1,那么从这一位上产生的1的个数 sum_i = (更高位的数字+1)*当前位的权重
数学呀是真的伟大呀w(゚Д゚)w
但是下面的代码依旧可以通过牛客网的在线编程,私以为应该是牛客网题目改了,但是测试用例没有改
代码实现
import java.util.*;
public class Solution{
public int NumberOf1Between1AndN_Solution(int n) {
int count = 0;
int i = 1;
int current = 0;
int before = 0;
int after = 0;
while((n/i) != 0){
current =(n/i)%10;
before = n/(i*10);
after = n - (n/i)*i;
if(current == 0){
count = count + before*(i);
}
if (current == 1) {
count = count + before*(i)+(after+1);
}
if(current>1){
count = count+(before+1)*(i);
}
i = i*10;
}
return count;
}
}