时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
热度指数:325443
本题知识点: 查找 数学
题目描述
求出1-13的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下113中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
代码
function NumberOf1Between1AndN_Solution(n)
{
let digit = 1, res = 0;
let low = 0, cur = n%10, high = Math.floor(n/10);
while(high != 0 || cur != 0){
if(cur === 0){ //当前位为0
res += high * digit; //高位*当前位数
}else if(cur === 1){ //当前位为1
res += high * digit + low + 1; //高位*当前位数+低位+1
}else{ //当前位为2~9
res += (high + 1) * digit; //(高位+1)*当前位数
}
low += cur * digit; //低位等于当前位
cur = high % 10; //当前位等于之前高位的末位
high = parseInt(high/10); //高位往前移一位
digit *= 10; //对应于低位进一位
}
return res;
}
分析:
按百位分析,如果计算百位上1出现的次数,受三个影响:百位上的数字,百位以上(高位)的数字,百位以下(低位)的数字
1. 百位上数字为0:受高位影响。如15012,百位上出现1的情况有:100~199,1100~1199,2100~2199,3100~3199,4100~4199,5100~5199,6100~6199,7100~7199,8100~8199,9100~9199,10100~10199,11100~11199,12100~12199,13100~13199,14100~14199共1500种。高位(15)*当前位数(100)
2. 百位上数字为1:受低位和高位影响。如6122,百位上出现1的情况有:100~122,100~199,1100~1199,2100~2199,3100~3199,4100~4199,5100~5199,623种。高位(6)*当前位数(100)+低位(22)+ 1
3. 百位上数字为2~9:受高位影响。如7300,百位上出现1的情况有:100~199,1100~1199,2100~2199,3100~3199,4100~4199,5100~5199,6100~6199,7100~7199共800种。高位+1(7+1)*当前位数(100)