演算法總結 數學 求1 N中1出現的次數

2021-06-01 09:46:09 字數 805 閱讀 6544

【程式設計之美】給定乙個十進位制正整數n,求出從1開始,到n的所有整數,數字1出現的次數。

例如,n=2,則兩個數為1,2 。數字1出現的個數是1.

又如n = 20.則20個數中1出現的為:1,10,11,12,13,14,。。。19 共有12個。

設計乙個演算法,可以高效地求出1-n之間出現的1的個數。(主要考慮效率)。

記錄:對於乙個數abcde。出現1的次數可以通過計算各位中出現的1的個數的和計算出來。以統計10位上1的個數為例,記icurrnum為當前要統計的位(例如10位上)的值(d),ilow為icurrnum低位的值(e),ihighnum為icurrnum高位的值(abc).

則根據icurr的值,出現1的個數可以歸納為:

i . icurrnum == 0; 則10位上出現1的次數由更高位的abc決定,且次數等於ihighnum * 10;

ii .icurrnum == 1;則10位上出現1的次數由高位和低位共同決定,次數等於 ihighnum*10  + ilownum+1

iii icurrnum >1, 則10位上1的次數由高位決定,且次數等於(ihigh+1) *10;

一次計算個位,10位,百位。。。等出現1的個數,相加,就是最終的結果。

編碼【改自程式設計之美p135】

#include int sum(int n)

ifactor *=10;

}return icount;

}main()

return 0;

}

如果數字過大,用long long 型別替代int.

求1 n整數中1出現的次數

自己不會,看看大神的解法,自己總結一下下,有更好的思路,望指教!解題思路 將數字進行拆分,分為三部分,高位,低位,和當前位 以求十位出現1的次數為例,digit 10 1.以n 1202為例,此時,高位high 12,低位low 2,當前位cur 0 此時十位出現1 的數字的範圍是 0010 111...

1 n中1出現的次數

輸入乙個整數 n 求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1 的數字有1 10 11和12,1一共出現了5次。示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 6 解析需要通過找規律來分析。假設我們對5014這個數字求解。1 個位上1出...

1 n整數中1出現的次數

示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 62.1 思路分析 題目要求1 n中1出現的次數,考慮將n轉換為字串,然後統計字元1的個數,但這樣會超時 既然1不行,換一種思路,將n轉換為字串後,可以容易確定n的位數 利用for迴圈,從個位開始直到最高位,計算每一位上1出現的次數...