51nod 1009 数字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的个数
Input示例
12
Output示例
5

#include<bits/stdc++.h>
using namespace std;
int dp[15];
void init()
{
    dp[0] = 0;
    for(int i=1;i<=9;i++)
        dp[i] = 10*dp[i-1] + pow(10,i-1);////预处理每位数中1的个数,例如i=3,就是1~999中含有1的个数
}

int Count(int n)
{
    int res=0,len=0,tail=0,radix=1,digit=0;
    while (n)
    {
        digit = n%10;
        n/=10;
        len++;

        if( digit > 1)
            res += radix+digit * dp[len-1];  //radix表示10^(len-1),例如len=3,就会有100~199这些数要计算,前导的1会产生radix个
        else if(digit == 1)
        {
            res += tail + 1 + dp[len-1];//tali表示dight后面的数
        }
        tail += digit *radix;
        radix *= 10;
    }
    return res;
}

int main ()
{
    init();
    int n;
    scanf("%d",&n);
    printf("%d\n",Count(n));
}

 

posted @ 2017-08-16 14:54  Draymonder  阅读(171)  评论(0编辑  收藏  举报