zoukankan      html  css  js  c++  java
  • 1009 数字1的数量

    1009 数字1的数量

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度: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

    写一下解题思路:

    这个题n很大,10^9,所以不能打表。我们就要采用比较高效的方法。

    如果我们来考虑每一个数,它一共有多少个1,这样想会很麻烦,我刚开始用排列与组合写了好久,发现到最高位的时候并不怎么好写。后来考虑另一种方法:

    我们统计每个位置上可能出现1的数,这样就把问题拆开了。

    比如:12。个位上可能出现1的数为1,11(一共2个),十位上可能出现1的个数为10,11,12(一共3个),加一起正好是5。(至于11是否重复的问题,还是再理解一下上面的做法,这个做法只考虑了每一位出现1的数,11在个位上算和在十位上算是不一样的,所以并没有重复)。


    那么我们再看一个多位数21905:

    个位:它出现1的数为:1 ~ 21901,一共 2190 - 0 + 1 = 2191

    十位:它出现1的数为:1x ~ 2181x (x 从0到9)一共:(218 - 0 + 1)*10 = 2190

    百位:它出现1的数为:1xx ~ 211xx ,一共:(21 - 0 + 1)* 100 = 2200

    千位:它出现1的数为:1xxx ~ 11xxx 和 21000 ~ 21905 ,那么很明显,这个情况就比较特殊了,为什么呢?下面再说,我们先计数,一共:(1 - 0 + 1)*1000 + (905 - 0 + 1)= 2000 + 906 = 2906

    万位:它出现1的数为:1xxxx ~ 1xxxx,一共:10000

    那么我们求和:2191 + 2190 + 2200 + 2906 + 10000 = 19487.

    然后我们说一下刚刚为什么会有特殊的情况:

    很明显,如果当前位是0或者大于1时,那么当前结果只与高位有关,如果是1的话,那么还要把低位的也考虑进去。

    
    
     1 #include <bits/stdc++.h>
     2 #define N 0x3f3f3f3f
     3 using namespace std;
     4 int main(){
     5   int n;
     6   int t,tn;
     7   long long int ans=0;
     8   int mul=1;
     9   cin>>n;
    10   tn=n;
    11   while(tn){
    12     t=tn%10;
    13     if(t==0){
    14       ans+=(n/(mul*10)*mul);
    15     }else if(t==1){
    16       ans+=(n/(mul*10)*mul);
    17       ans+=n%mul+1;
    18     }else{
    19       ans+=(n/(mul*10)+1)*mul;
    20     }
    21     mul*=10;
    22     tn/=10;
    23   }
    24   cout<<ans<<endl;
    25   return 0;
    26 }
  • 相关阅读:
    k8s 组件介绍-kube-controller-manager
    k8s 组件介绍-API Server
    ELK+filebeat+redis 日志分析平台
    Logstash配置文件详情
    Logstash,Fluentd, Logtail对比伤害
    公司redis
    Linux之网络ping(unknown host)故障及yum no more mirrors to try
    Linux思维导图之计划任务
    Linux思维导图之进程管理
    Linux思维导图之网络管理
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7359091.html
Copyright © 2011-2022 走看看