数字1的数量
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Sample Input
12
Sample Output
5
用dp的思想,就是要从每一位考虑 1 的个数,而且要分不同的情况:例如 38104
1,当该位大于 1 的时候,此时只考虑比它高的位数就行,就是 (38104 / 10 + 1) = 3811
2,当该位为 0 的时候,例如十位,此时和上面一样,不过不用加一,就是 (38104 / 100 × 10)= 3810
3,当该位为 1 的时候既要高位的也要比它低位的,就像百位, 就是(104 % 100 + 1)= 5,
还要考虑它的高位 (38104 / 1000 × 100) = 3800。
计算千位和万位就是,((38104 / 10000 + 1) × 1000) = 4000,((38104 / 100000 + 1)× 10000)= 100000
结果就是3811 + 3810 + 5 + 3800 + 4000 + 100000 = 25426
#include<stdio.h>
void qh(int n)
{
int ans = 0,num = 1;
int st = n;
while(st > 0)
{
int m = st % 10;//每一位的尾数
if(m == 0)//下面是分的三类
ans += n / (num * 10) * num;
else if(m == 1){
ans += n / (num * 10) * num;
ans += n % num + 1;
}
else
ans += (n / (num * 10) + 1) * num;
st /= 10;//把计算过的除去
num *= 10;//代表递增的位数
}
printf("%d\n",ans);
}
int main()
{
int n;
while(~scanf("%d",&n))
qh(n);
return 0;
}