1. 給定乙個整數n,那麼n的階乘n!末尾有多少個0呢?例如:n=10,n!=3 628 800,n!的末尾有兩個0。
2. 求n!的二進位制表示中最低位1的位置。
解答:
有些人碰到這樣的題目會想:是不是要完整計算出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
1 ret = 0;2【問題1的解法二】for(i = 1; i <= n; i++)
310 }
公式:z = [n/5] +[n/52] +[n/53] + …(不用擔心這會是乙個無窮的運算,因為總存在乙個k,使得5k
> n,[n/5k
]=0。)
公式中,[n/5]表示不大於n的數中5的倍數貢獻乙個5,[n/52]表示不大於n的數中52的倍數再貢獻乙個5,……**如下:
1 int ret = 0;2while
(n)3
7問題2要求的是n!的二進位制表示中最低位1的位置。給定乙個整數n,求n!二進位制表示的最低位1在第幾位?例如:給定n = 3,n!= 6,那麼n!的二進位制表示(1 010)的最低位1在第二位。return ret;
為了得到更好的解法,首先要對題目進行一下轉化。
首先來看一下乙個二進位制數除以2的計算過程和結果是怎樣的。
把乙個二進位制數除以2,實際過程如下:
判斷最後乙個二進位制位是否為0,若為0,則將此二進位制數右移一位,即為商值(為什麼);反之,若為1,則說明這個二進位制數是奇數,無法被2整除(這又是為什麼)。
所以,這個問題實際上等同於求n!含有質因數2的個數。即答案等於n!含有質因數2的個數加1。
【問題2的解法一】
由於n! 中含有質因數2的個數,等於 n/2 + n/4 + n/8 + n/16 + …[1],
根據上述分析,得到具體演算法,如下所示:
**清單2-7
1【問題2的解法二】int lowestone(intn)2
9return
++ret;
10 }
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,即等於將整個二進位制數向低位移一位。
如果為2的方冪則它的二進位制只有乙個位為1,所以只需要判斷n&(n
-1)是否為0即可,即(n&(
n-1))==0)
不要被階乘嚇倒
階乘 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的階...