有些人碰到這樣的題目會想:是不是要完整計算出
n!的值?如果溢位怎麼辦?事實上,如果我們從「哪些數相乘能得到10」
這個角度來考慮,問題就變得簡單了。
首先考慮,如果n!
= k×
10m,且
k不能被
10整除,那麼
n!末尾有m個
0。再考慮對
n!進行質因數分解,n!
=(2x)×(
3y)×(5z)
…,由於
10 = 2×5
,所以m只跟x
和z相關,每一對2和
5相乘可以得到乙個
10,於是
m= min(x
, z)。不難看出
x大於等於
z,因為能被
2整除的數出現的頻率比能被
5整除的數高得多,所以把公式簡化為
m= z。
根據上面的分析,只要計算出
z的值,就可以得到
n!末尾
0的個數。 【
問題1的解法一
】要計算
z,最直接的方法,就是計算i(
i =1, 2, …,n
)的因式分解中
5的指數,然後求和:
**清單
2-6
ret = 0;
for(i = 1; i <= n; i++)}
【問題1的解法二
】公式:
z= [n/5] +[n/52] +[n/53] +
…(不用擔心這會是乙個無窮的運算,因為總存在乙個
k,使得
5k > n
,[n/5k
]=0。)
公式中,
[n/5]
表示不大於
n的數中
5的倍數貢獻乙個5,
[n/52]
表示不大於
n的數中
52的倍數再貢獻乙個5,
……**如下:
ret = 0;
while(n)問題2
要求的是
n!的二進位制表示中最低位
1的位置。給定乙個整數n,求
n!二進位制表示的最低位
1在第幾位?例如:給定
n= 3,n
!= 6
,那麼n
!的二進位制表示(
1 010
)的最低位
1在第二位。
為了得到更好的解法,首先要對題目進行一下轉化。
首先來看一下乙個二進位制數除以
2的計算過程和結果是怎樣的。
把乙個二進位制數除以
2,實際過程如下:
判斷最後乙個二進位制位是否為
0,若為
0,則將此二進位制數右移一位,即為商值(為什麼);反之,若為
1,則說明這個二進位制數是奇數,無法被
2整除(這又是為什麼)。
所以,這個問題實際上等同於求
n!含有質因數
2的個數。即答案等於
n!含有質因數
2的個數加1。
【問題2
的解法一】由於
n! 中含有質因數
2的個數,等於
n/2 + n/4 + n/8 + n/16 + …,
根據上述分析,得到具體演算法,如下所示:
**清單
2-7
int lowestone(int n)
return ret;
} 【問題2的
解法二】
n!含有質因數
2的個數,還等於n減去
n的二進位制表示中
1的數目。我們還可以通過這個規律來求解。
下面對這個規律進行舉例說明,假設
n= 11011
,那麼n
!中含有質因數
2的個數為
n/2 + n/4 + n/8 + n/16 + …即:
1101 + 110 + 11 + 1 =
(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1 =(
1000 + 100+ 10 + 1)+
(100 + 10 + 1
)+ 1
= 1111 + 111 + 1 =
(10000 -1
)+(1000-1
)+(10
-1)+
(1-1
) = 11011-n
二進位制表示中
1的個數
任意乙個長度為
m的二進位制數
n可以表示為n=
b[1] +
b[2] * 2 +
b[3] * 22 + …+
b[m] * 2(m-1)
,其中b
[ i ]
表示此二進位制數第
i位上的數字(1或
0)。所以,若最低位
b[1]為1
,則說明
n為奇數;反之為偶數,將其除以
2,即等於將整個二進位制數向低位移一位。
給定整數
n,判斷它是否為2n
>0&&((n
&(n-
1))==0))。
相關資源:
《程式設計之美》編輯部
|
《程式設計之美》豆瓣
|
《程式設計之美》互動網購買
|
作者blog
作者豆瓣
這個規律請讀者自己證明(提示n/k
,等於1, 2, 3,
…, n
中能被k
整除的數的個數)。
不要被階乘嚇倒
階乘 factorial 是個有意思的函式,但是不少人都比較怕它,我們來看看兩個與階乘相關的問題.1.給定乙個整數n,那麼n的階乘n!末尾有多少個0呢?例如 n 10,n 3628 800的末尾有兩個0.2.對於n 的二進位制表示中最低位 的位置.解 問題一的解法一 第乙個問題比較簡單我一下就想出來...
不要被階乘嚇倒
public class jiecheng system.out.println count n的階乘中 因子k 的個數有個公式 z n k n k2 n k3 n kx param a public static void execute2 int a system.out.println cou...
不要被階乘嚇倒
問題1 n的階乘中末尾有幾個0 考慮對n!進行質因數分解,n!2 x 3 y 5 z 由於10 2 5,所以m只跟x和z相關,每一對2和5相乘可以得到乙個10,於是m min x,z 不難看出x大於等於z,因為能被2整除的數出現的頻率比能被5整除的數高得多,所以把公式簡化為m z。其實也就是求n的階...