整數中1出現的次數(從1到n整數中1出現的次數)

2021-09-28 10:44:20 字數 1918 閱讀 2192

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

類似於這樣的題目,我們可以採用歸納法來解決問題。

我們知道個位上的1每隔10會出現一次,例如1,11,21等。如果以10為乙個階梯的話,那麼每個階梯就包含1個1.比如說32,它就可以劃分為3個階梯,0-9,10-19,20-29,每個階梯裡面個位數上1的個數為1。很明顯,他還包含2這個不完整的階梯。在這個不完整的階梯裡面判斷是否有1,可以它的個位數是否小於1,如果小於1,就不包含1,反之,包含1個1.

我們可以歸納個位數上出現1的個數:

(n/10)*1 + (n%10>=1?1:0)

十位上出現1的情況應該是10-19,很明顯,這些數中十位上的1出現了10次。10-19每隔100個數會出現一次,例如110-119,210-219等。所以我們劃分100為1個階梯,每個階梯裡1出現的個數為10.例如111,它包含乙個完整的階梯1-100,裡面包含十個十位數上的1,還有不完整的階梯,我們考慮不完整的階梯中的數如果小於10,說明再沒有十位上的1,如果大於19,說明十位上的1還有10個,如果在10到19之間,我們計算的結果應該是(n%10)-10+1.例如我們分析300-317,17個數字,1出現的個數應該是17-10+1=8個。

我們可以歸納十位數上出現1的個數

k = n%10

(n/100)*10 + (if(k<10) 0 else if(k>19) 10 else (k-10+1))

百位上出現1的情況應該是100-199,裡面包含100個百位上的1。100-199每隔1000會出現1次,那麼階梯為1000.例如2139。跟上述思想一致,先算階梯數 * 完整階梯中1在百位出現的個數,即n/1000 * 100得到前兩個階梯中1的個數,那麼再算漏出來的部分139,沿用上述思想,不完整階梯數k199,得到100個百位1,100<=k<=199則得到k - 100 + 1個百位1。

我們可以歸納百位數上出現1的次數

k = n % 1000

(n / 1000) * 100 + (if(k >199) 100 else if(k < 100) 0 else k - 100 + 1)

到了這裡,已經能看出它的規律了。

設i為計算1所在的位數,i=1表示計算個位數的1的個數,10表示計算十位數的1的個數等等。

k = n % (i * 10)

count(i) = (n / (i * 10)) * i + (if(k > i * 2 - 1) i else if(k < i) 0 else k - i + 1)

好了,到了這裡從10到10的n次方的歸納就完成了。

sum1 = sum(count(i)),i = math.pow(10, j), 0<=j<=log10(n)

public class solution 

int count = 0;

for(int i = 1; i <= n; i*=10)else if(k > (i*2-1))else

count += a;

}return count;

}}

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...

整數中1出現的次數(從1到n整數中1出現的次數)

時間限制 1秒 空間限制 32768k 題目描述 include using namespace std class solution 求之前的length 1位中含乙個數 int base1 0 int base2 1 for int i 0 i1 i cout cout cout 求從base2...

整數中1出現的次數(從1到n整數中1出現的次數)

求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。演算法一 暴力累加...