zoukankan      html  css  js  c++  java
  • Leetcode 233.数字1的个数

    数字1的个数

    给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

    示例:

    输入: 13

    输出: 6

    解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

    1的总个数为1在1~n所有数中

    个位数上有1的个数+十位数上有1的个数+...+亿位数上有1的个数+...

    自己动手亲自找一遍规律就能得出答案:

    首先,找规律:

    13

    个位数为1:1 11

    十位数为1:10 11 12 13

    1的总个数为: 2+4=6

    23

    个位数为1:1  11 21

    十位数为1:10 11 12 13 14 15 16 17 18 19

    1的总个数为:3+10=13

    345

    个位数为1:1 11 21 31 41 51 61 71 81 91 101 111 121 131 141   ...341

    十位数为1:10 11 12 13 14 15 16 17 18 19  ...311 312 ...319

    百位数为1:100  101...199

    1的总个数为:100+40+35=175

    进而可得通项:

    通项:求某一位的1的个数

    高n位*本位(比如百位就乘100)+  0                             (本位小于1)

    1*本位                     (本位大于1)

    低n位+1                  (本位等于1)

    也就是说,某位(各位,十位...)1的总个数可能与其高位,低位以及自己的

    值有关,具体对应情况如上

    例如算12345:

    个位1:1234*1+1(个位>=1加1)

    十位1:123*10+10

    百位1:12*100+100

    千位1:1*1000+1000

    万位1:2345+1

    1的总个数为:8121

    例如算23012:

    个位1:2301*1+1

    十位1:230*10+2+1  (十位=1加低位即2然后加1)

    百位1:23*100            (百位为0加0)

    千位1:2*1000+1000

    万位1:10000

    1的总个数为:19905

    通俗来说,某位(个位,十位..)上1的个数=

    基础数+当前位为>0,<0,=0时的情况,

    而基础数为当前位前面的高位*当前位

    (例如:23012,当 当前位为百位时,基础数=23(前高位)*100+上面讨论的情况)

     1 class Solution {
     2 public:
     3     int countDigitOne(int n) {
     4         int k = 1, sum = 0, curr, large, small = 0;
     5         while (n>0){
     6             curr = n % 10;
     7             large = n / 10;
     8             if (curr>1)
     9                 sum = sum + large*k + k;
    10             else if (curr<1)
    11                 sum += large*k;
    12             else
    13                 sum += large*k + small + 1;
    14             small = small + curr*k;
    15             n = n / 10;
    16             k = k * 10;
    17         }
    18         return sum;
    19     }
    20 };
  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10203094.html
Copyright © 2011-2022 走看看