十進位制1出現的次數

2021-09-01 23:35:21 字數 1913 閱讀 9604

給定乙個十進位制正整數n

,求出從

1開始到

n的所有整數中,「

1」出現的個數。如:

n = 13 ,那麼

1,2,3

,4,5,6,7

……,10,11,12,13中「1

」出現的個數為 6

解法一:

這個問題看上去並不困難,可以想到的就是 從1 

開始遍歷到

n,將其中每乙個數中含有的「

1」相加起來,自然就得到了從

1 到 

n 所有「

1」的個數和。

**清單:

/*

* 判斷乙個整數中出現1 的次數

* 用%運算,依次判斷個位、十位、百位…上的數字是否為1

*/public static int count1inainteger(int n)

return count1;

} /*

* for 遍歷1 到 整數n,

* 將所有整數中出現"1" 的次數累加

*/public static int fun(int n)

return count;

}

該方法很容易理解,實現也比較容易,最致命的問題是效率。如果

n很大,則需要很長的時間才能得出計算結果。測試了一下,如果 

n= 100 000 000

,大約需要40秒

解法二:

想要提高效率,必須摒棄解法一中的遍歷演算法。能不能分析正整數每一位上「1

」出現的次數,來解決問題呢? 

假設n= abcdef 

,這裡 

a,b,c,d,e,f 

分別是n

各個數字上的數字。如果現在要計算百位

d 上出現「

1」的次數,它將會受到三個因素的影響:百位上的數字,百位以下的數字(低位),百位以上的數字(更高位)。

1、如果百位上的數字為0

,可知,百位上出現「

1」的次數由更高位決定。比如

12013

,百位上出現「

1」的情況是 

100~199,1100~11991,2100~2199

,……,

11100~11199

,一共有

1200

個,也就是說由更高位數字(

12)決定,並且等於更高位(12)

* 當前位數(

100)

= 1200

2、如果百位上的數字為1

,百位上出現「

1」的次數不僅受高位影響,還受低位的影響,比如

12113

,我們已經知道受高位影響出現「

1」的次數為

1200

,受低位影響會出現「

1」的數字 

12100~12113 

,有13個3、

如果百位上的數字大於1

,則百位上出現「

1」的次數僅由更高位決定。比如

12213

,百位上出現「

1」的情況是:

100~199,1100~11991,2100~2199

,……,

11100~11199

,12100~12199

,一共1300個,[

更高位(12)

+1]*

當前位數(

100)

public static int fun2(int n) 

ifactor *= 10;

} return count;

}

該解法同樣計算n = 100 000 000

,只需要不到

1毫秒的時間,相對於第一種效率至少提高了

40 000 

倍。

整數中1出現的次數

針對牛客網試題作個記錄 問題 整數中1出現的次數 從1到n整數中1出現的次數 求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問...

整數中1出現的次數

乙個更好的辦法是利用數學公式直接計算出最終的結果,該方法是依次求出數字 x 在個位 十位 百位等等出現的次數,再相加得到最終結果。這裡的 x 1,9 x 1,9 因為 x 0 x 0不符合下列規律,需要單獨計算。首先要知道以下的規律 依此類推,從 1 至 10 i 10i 在它們的左數第二位 右數第...

整數中1出現的次數

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