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