1. 程式人生 > >Leetcode 233.數字1的個數

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 };