51Nod ----1009 数字1的数量

基准时间限制:1 秒 空间限制:131072 KB

给定一个十进制正整数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

思路:
可以从数字中找关系。例如:n = 1234时,个位上的1有多少个?答案很显然是124个。
因为每10个数就有一个个位1,则1234/10= 123 而明显1231也有个位1,所以是124个。
那么十位1呢?答案是130个。同样我们可以分析出100个数里有10个十位1,则很容易算出130。
那么我们推广开来发现每个位上的1的数量受其高位,当前位和低位的影响。大家可能一想觉的
这不都屁话吗?高位+当前位+低位不就是n吗?——确实,不过这种拆开的思路很重要。

代码:

#include <iostream>

using namespace std;

typedef long long ll;

ll QO(ll N){

    ll sum = 0;
    ll now,high,low;

    ll i = 1;
    while(N/i){
        now = (N%(i*10))/i;
        high = N/(i*10);
        low = N - (N/i)*i;

        if(now > 1)sum += (high+1)*i;
        else if(now == 1)sum += high*i + low+1;
        else if(now == 0)sum += high*i;

        i *= 10;
    }

    return sum;

}

int main(){

    ll N;
    cin>>N;

    cout<<QO(N)<<endl;

    return 0;
}
原文地址:https://www.cnblogs.com/vocaloid01/p/9514220.html