题目:
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:
可以一位一位考虑,对于10^b位:例如23456的百位
1)此位大于1,这一位上1的个数有 ([n / 10^(b+1) ] + 1) * 10^b (24*100:千位万位从0到23,百位的1会出现100次)
2)此位等于0,为 ([n / 10^(b+1) ] ) * 10^b(若百位为0,则千位万位从0到22)
3)此位等于1,在0的基础上加上n mod 10^b + 1(同上,但百位的1出现了56次)
对23456:
b=0:2346
b=1:2350
b=2:2400
b=3:3000
b=4:10000
加起来,和为20096
#include <iostream>
using namespace std;
int num_of_1(int n)
{
/*it should cover all powers of 10 within int range*/
static int pows[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 100000000};
int b = 0, count = 0;
while(n >= pows[b]){
switch( (n % pows[b+1]) / pows[b]){
case 0:
count += (n / pows[b + 1]) * pows[b];
break;
case 1:
count += (n / pows[b + 1]) * pows[b];
count += n % pows[b] + 1;
break;
default:
count += (n / pows[b + 1] + 1) * pows[b];
}
b++;
}
return count;
}
int main()
{
cout << num_of_1(23456) << endl;
return 0;
}