劍指offer 九度oj 整數中1出現的次數

2021-06-13 05:20:36 字數 1793 閱讀 9362

題目16:整數中1出現的次數

時間限制:1 秒

記憶體限制:32 兆

特殊判題:否

題目描述:親們!!我們的外國友人

yz這幾天總是睡不好

,初中奧數里有乙個題目一直困擾著他

,特此他向

jobdu

發來求助信

,希望親們能幫幫他。問題是:求出

1~13

的整數中

1出現的次數

,並算出

100~1300

的整數中

1出現的次數?為此他特別數了一下

1~13

中包含1

的數字有1、

10、11、

12、13因此共出現6次

,但是對於後面問題他就沒轍了。

acmer

希望你們幫幫他

,並把問題更加普遍化

,可以很快的求出任意非負整數區間中

1出現的次數。

輸入:輸入有多組資料

,每組測試資料為一行。

每一行有兩個整數

a,b(0<=a,b<=1,000,000,000)。

輸出:對應每個測試案例,輸出

a和b之間

1出現的次數。

樣例輸入:

0 5

1 13

21 55

31 99

樣例輸出:

164

7

題目分析:找出1到a所有整數中1出現的次數和1到b所有整數中1出現的次數,然後求其差值即可。此題不可用暴力演算法,會超時,最大範圍為10億。那麼我們來分析一下,看看能不能有其他的求解辦法。

例如1234這個數,1的個數之和為千位上出現的次數+百位上出現的次數+十位上出現的次數+個位上出現的次數,

即1出現的次數689    =    235          +           100              +                130          +         124

又例如1046這個數,1出現的次數362   =    47           +           100              +                 110         +         105

再例如1146這個數,1出現的次數362   =    147         +          147               +                 120         +         115

通過分析可知,在某位上出現1的次數與自身位相關,而且也與之前的位和之後的位相關。

由此可將乙個數拆分為 前面部分+中間位+後面部分,或front+mid+back(例如1146在求百位中的1出現次數時,可看成1+1+46來處理)

我們可得如下規律:

當mid > 1時,1出現的次數為10^(back的位數) * (front+1) ;

當mid == 1時,1出現的次數為

10^(back的位數)* front + (back + 1) ;

當mid == 0時,1出現的次數為

10^(back的位數) * front ;

**如下:

#include long long fun(long long n)

return num;

}int main()

注意:a和b的輸入是不分大小的

九度劍指offer 1384

題目鏈結 題目給出了乙個二維陣列,行從上到下遞增,列從左到右遞增。給出乙個目標數,來查詢該目標數是否存在於這個二維陣列中。很直接的想法就是由兩個二分查詢來組成,但是這樣的想法會存在明顯的問題 1 32 4 對於這樣的2 2的陣列,查詢3這個元素,如果先對第一列元素進行二分查詢,很明顯就找不到3這個元...

劍指offer(查詢) 整數中1的出現次數

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

九度OJ 1084 整數拆分

題目描述 乙個整數總可以拆分為2的冪的和,例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 總共有六種不同的拆分方式。再比如 4可以拆分成 4 4,4 1 1 1 1,4 2 2,4 1 1 2。用f n...