題目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 51 13
21 55
31 99
樣例輸出:
1647
題目分析:找出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...