zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    TextField KeyUp事件
    extjs 弹出windowsurl
    coolite TreePanel CheckBox联动
    自动生成储存过程及.net代码(sql2000,sql2005,sql2008)
    ComboBox三级关联
    ext window关闭
    DLL编写教程
    阿里云笔试题
    c/c++复杂声明的理解
    malloc/free与new/delete的区别
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514220.html
Copyright © 2011-2022 走看看