求1的數目

2021-06-22 12:14:56 字數 1002 閱讀 6963

題目:

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