程式設計之美 1的數目

2022-02-02 12:10:28 字數 913 閱讀 9389

/*

程式設計之美系列:

*///

01 一的數目:

#include

using

namespace

std;

//暴力:

/*int f(int n)

n/=10;

}return count;}*/

//數學思想

/*假設n=abcde為乙個整數,a,b,c,d,e分別對應十進位制數,如果要計算(1到n)百位出現1的個數,他將受三個因素的影響:百位以上的數,百位數和百位一下的數,具體依賴如下:

分別設整數n百位以上,百位和百位一下的數字分別為:prenum,curnum,pronum,如n=abcde的三個值分別為:

prenum=ab

curnum=c

pronum=de

分三種情況討論百位上的數字出現1的計數(用onecount表示)

情況1:百位數字為0(curnum=0),onecount=prenum*100;

情況2:百位數字為1(curnum=1),onecount=prenum*100+pronum+1;

情況3:百位數字大於1(curnum>1),onecount=(prenum+1)*100;

其他位計算1出現的個數類似

* 對於數abcde,c這位出現1的次數分以下情況:

* 1.若c > 1,結論是(ab + 1)* 100;

* 2.若c == 1,結論是(ab)* 100 + de + 1;

* 3.若c < 1,結輪是 ab * 100 + de + 1;

*/int f (int

n) t*=10

; }

return

count;

}int

main()

程式設計之美 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...

程式設計之美 1的數目

問題1描述 求1 n十進位制中1的數目f,f 12 5 include typedef long long ll ll sum1s ll n ifactor 10 return icount int main 2 求滿足f n n的最大數 找規律 9以下 1個 99以下 20個 999以下 300個...