計算0到n(包括n)之間2的個數

2021-10-16 15:10:16 字數 2107 閱讀 1598

1.首先最直接的解法就是遍歷每個數字的每一位,然後統計2的個數;**如下:

public

intcountnumberof2s

(int n)

int count =0;

for(

int i =

2;i <= n;i++

) i /=10;

}}return count;

}

上述方法最大的問題就是效率,當n非常大時,就需要很長的執行時間。 想要提高效率,就要避開暴力法,從數字中找出規律。

2.假設乙個5位數n=abcde,我們現在來考慮百位上出現2的次數,即,從0到abcde的數中, 有多少個數的百位上是2。分析完它,就可以用同樣的方法去計算個位,十位,千位, 萬位等各個位上出現2的次數。

當百位c為0時,比如說12013,0到12013中哪些數的百位會出現2?我們從小的數起, 200-299, 1200-1299, 2200-2299, … , 11200-11299, 也就是固定低3位為200-299,然後高位依次從0到11,共12個。再往下12200-12299 已經大於12013,因此不再往下。所以,當百位為0時,百位出現2的次數只由更高位決定, 等於更高位數字(12)x當前位數(100)=1200個。

當百位c為1時,比如說12113。分析同上,並且和上面的情況一模一樣。 最大也只能到11200-11299,所以百位出現2的次數也是1200個。

上面兩步綜合起來,可以得到以下結論:

當某一位的數字小於2時,那麼該位出現2的次數為:更高位數字x當前位數

當百位c為2時,比如說12213。那麼,我們還是有200-299, 1200-1299, 2200-2299, … , 11200-11299這1200個數,他們的百位為2。但同時,還有一部分12200-12213, 共14個(低位數字+1)。所以,當百位數字為2時, 百位出現2的次數既受高位影響也受低位影響,結論如下:

當某一位的數字等於2時,那麼該位出現2的次數為:更高位數字x當前位數+低位數字+1

當百位c大於2時,比如說12313,那麼固定低3位為200-299,高位依次可以從0到12, 這一次就把12200-12299也包含了,同時也沒低位什麼事情。因此出現2的次數是: (更高位數字+1)x當前位數。結論如下:

當某一位的數字大於2時,那麼該位出現2的次數為:(更高位數字+1)x當前位數

根據上面結論我們可以寫出如下**:

public

intcountnumberof2s

(int n)

else

if(cur >2)

else

if(cur ==2)

}return count;

}

如果我們把問題一般化一下:寫乙個函式,計算0到n之間i出現的次數,i是1到9的數。 這裡為了簡化,i沒有包含0,因為按以上的演算法計算0出現的次數, 比如計算0到11間出現的0的次數,會把1,2,3,4…視為01,02,03,04… 從而得出錯誤的結果。所以0是需要單獨考慮的,為了保持一致性,這裡不做討論。 將上面的三條結論應用到這就是:

當某一位的數字小於i時,那麼該位出現i的次數為:更高位數字x當前位數

當某一位的數字等於i時,那麼該位出現i的次數為:更高位數字x當前位數+低位數字+1

當某一位的數字大於i時,那麼該位出現i的次數為:(更高位數字+1)x當前位數

**如下:

public

intcountnumberofnums

(int n,

int num)

int count =0;

int high;

int low;

int cur;

for(

int i =

1;i <= n;i *=10)

else

if(cur > num)

else

if(cur == num)

}return count;

}

統計0到n之間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 1位數的情況 在解法二中已經分析過,大於等於1的時候。有1個,小於1就沒有。2位數的情況 n 13,個...

統計0到n之間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 1位數的情況 在解法二中已經分析過,大於等於1的時候,有1個,小於1就沒有。2位數的情況 n 13,個位數...

統計0到n之間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 方法一 暴力求解 最直接的方法就是從1開始遍歷到n,將其中每乙個數中含有 1 的個數加起來,就得到了問題的解。如下...