題目:
給定乙個十進位制的正整數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.
寫乙個函式f(n),返回1
到n之間出現
1的個數,如
f(12)=5.
注意:請你在寫完基本功能**v1.0
版本後進行壓力測試,看看當
n=100000000
和n=1000000000
你的**還能否運算出結果。如果無法在短時間內運算出結果,請你改進演算法,完成乙個能通過壓力測試的
v2.0
版本**。
**如下:
#include "stdio.h"
int main()
if(num/i<=0)
break;
} printf("%i64d\n",count);
return 0;
}
設count為1的總個數,i=1,10,100,1000......
當b==0時,n += a*i;
當b==1時,n += a*i+c+1;
當b>=2時,n += (a+1)*i;
比如輸入12345(f(12305)=8121)
計算個位數(i=1)時,將12305分為a:1230 b:5 c:0
因為b>=2
n += (a+1)*i;
計算十位數(i=10)時,將12305分為a:123 b:0 c:5
因為b==0
n += a*i; .
. .計算萬位時(i=10000)時,將12305分為a:0 b:1 c:2305
因為b==1
n += a*i+c+1;
n即為1的總個數。
求逆序對數目
設計乙個平均時間為o n logn o nlogn o nlog n 的演算法,在n 1 n 1000 n 1 n 1000 n 1 n 1 000 個元素的陣列中尋找逆序對數目 這裡介紹分治的思想,用歸併對陣列進行排序,在排序的過程中,即可順便將逆序對數目求出來 首先,不斷地二分這個陣列,直到最小...
求逆序對數目
題目描述 給定乙個序列 a1,a2,a na 1,a 2,a n a1 a2 an 如果存在 a i aj a i a j ai aj 且 i i j 那麼我們稱之為逆序對的,求逆序對的數目。輸入第一行為 n nn,表示序列長度,接下來的 n nn 行,第 i 1 i 1i 1 行表示序列中的第 i...
累積1的數目
問題如下 給定1個十進位制正整數n,計算從1到n的所有整數中 數字1 出現的個數 例如 n 12,序列 其中出現 1 的個數是5 故f 12 5 解法 對於此題,程式設計之美 中給出了乙個巧妙的解法。主要思路是 將總結果拆分成幾個結果的和,如對於乙個5位的整數abcde,序列中百位上出現1的次數受百...