給定乙個十進位制正整數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整數...