累積1的數目

2021-06-26 15:52:24 字數 682 閱讀 6595

問題如下:給定1個十進位制正整數n,計算從1到n的所有整數中「數字1」出現的個數

例如:n=12,序列=,其中出現「1」的個數是5;故f(12)=5

解法:對於此題,《程式設計之美》中給出了乙個巧妙的解法。

主要思路是:將總結果拆分成幾個結果的和,如對於乙個5位的整數abcde,序列中百位上出現1的次數受百位上的數字c影響,千位上出現1的次數受b影響,依此類推;最後將各個數字上1出現的次數加起來即為總和。

歸納總結,分成以下三種情況:以百位上的數字c為例:

1.如果c=0;則1在百位出現的次數受高位上的數字影響,為高位數字ab*100(100為當前乘數因子,在個位時為1,十位為10,百位為100等等)

2.如果c=1;則1在百位出現的次數既受高位影響,也受低位影響,高位影響的個數為高位數字ab*100(當前因子),低位影響的個數為低位數字de+1

3.如果c>1;則1在百位出現的次數僅受高位上的數字影響,為(ab+1)*100(當前因子)

cpp**:

#include using namespace std;

int countone(int num)

num/=10;

factor*=10;

}return cnt;

}int main(){

int n;

while(cin>>n){

cout<

求1的數目

題目 給定乙個十進位制的正整數n 求從1 開始到n 的所有整數中,出現 1的個數。如 n 2 即1,2 出現1個1 n 12,即 1,2,3,4,5,6,7,8,9,10,11,12 出現5個1.寫乙個函式f n 返回1 到n之間出現 1的個數,如 f 12 5.注意 請你在寫完基本功能 v1.0 ...

程式設計之美 1的數目

我一上來就是遍歷著計算,但在面試或者應用中決計是不可行的。我們換一種思路,乙個數abcdefg,我們計算出各位,十位,百位。有多少個1,加一起即可。就23012來說,看百位上它為0,從1 23012中,百 位上有多少個1取決於比它高的所有位決定。100 199,1100 1199,2100 2199...

程式設計之美 1的數目

給定乙個十進位制正整數n,寫下從1開始,到n的所有整數,然後數一下其中出現的所有 1 的個數。解法一 窮舉法,遍歷1到n的每乙個數,計算其出現1的整數的個數 雖然笨,但是想不出其他方法就這樣了 解法二 分類討論,分別討論個位,十位和百位.上1能出現的次數。假設這個數為abcd,則 d 為1時,出現1...