题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
题目分析:考虑从低位开始,进行循环加1,逢十进一。在某一位上“1”出现的次数受高位和低位的共同作用。以“百”位为例,高位*100为高位控制下,百位上“1”出现的次数。低位控制下百位上“1”出现的次数要看百位上的数字是否大于1,大于1 则出现100次,等于1则出现十位和各位组成的数字+1的次数。
int NumberOf1Between1AndN_Solution(int n){
int count = 0;//计数器
int base = 1;//基数:在不同位上存在10的幂次方倍
int weight = 0;//余数
int round = n;//循环
while (round > 0)
{
weight = round % 10;
round /= 10;
count += round*base;//高位作用下,该位1出现的次数
if (1 == weight)//低位作用下,该位1出现的次数
count += (n%base) + 1;
else if (weight > 1)
count += base;
base *= 10;
}
return count;
}