1024 末尾有多少個0?

2021-06-18 20:41:45 字數 2607 閱讀 6008

先把答案貼出來,具體證明在下面……

末尾0的個數取決於乘法中因子2和5的個數。顯然乘法中因子2的個數大於5的個數,所以我們只需統計因子5的個數。

是5的倍數的數有: 1024 / 5 = 204個

是25的倍數的數有:1024 / 25 = 40個

是125的倍數的數有:1024 / 125 = 8個

是625的倍數的數有:1024 / 625 = 1個

所以1024! 中總共有204+40+8+1=253個因子5,也就是說1024! 末尾有253個0。

int countzero(int num) 

return result;

}

階乘(factorial)是個很有意思的函式,但是不少人都比較怕它,我們來看看另外兩個與階乘相關的問題:

1、 給定乙個整數n,那麼n的階乘n!末尾有多少個0呢?例如:n=10,n!=3 628 800,n!的末尾有兩個0。

2、求n!的二進位制表示中最低位1的位置。

有些人碰到這樣的題目會想:是不是要完整計算出n!的值?如果溢位怎麼辦?事實上,如果我們從"哪些數相乘能得到10"這個角度來考慮,問題就變得簡單了。

首先考慮,如果n!= k×10^m,且k不能被10整除,那麼n!末尾有m個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。

根據上面的分析,只要計算出z(能被5整除的數的個數)的值,就可以得到n!末尾0的個數。

【問題1的解法一】

要計算z,最直接的方法,就是計算i(i =1, 2, …, n)的因式分解中5的指數,然後求和: 

[cpp]view plain

copy

ret = 0;   

for(i = 1; i <= n; i++)   

}  【問題1的解法二】

公式:z = [n/5] +[n/5^2] +[n/5^3] + …(不用擔心這會是乙個無窮的運算,因為總存在乙個k,使得5^k > n,[n/5^k]=0。)

公式中,[n/5]表示不大於n的數中5的倍數貢獻乙個5,[n/5^2]表示不大於n的數中5^2的倍數再貢獻乙個5,……**如下:

[cpp]view plain

copy

ret = 0;   

while

(n)     

問題2要求的是n!的二進位制表示中最低位1的位置。給定乙個整數n,求n!二進位制表示的最低位1在第幾位?例如:給定n = 3,n!= 6,那麼n!的二進位制表示(1 010)的最低位1在第二位。

為了得到更好的解法,首先要對題目進行一下轉化。

把乙個二進位制數除以2,實際過程如下:

判斷最後乙個二進位制位是否為0,若為0,則將此二進位制數右移一位,即為商值;反之,若為1,則說明這個二進位制數是奇數,無法被2整除。

所以,這個問題實際上等同於求n!含有質因數2的個數+1。即答案等於n!含有質因數2的個數加1

。 實際上n!都為偶數,因為質因數裡面都有乙個2,除了1以外,因為1的階乘是1,是個奇數,其他數的階乘都是偶數。。

【問題2的解法一】

由於n! 中含有質因數2的個數,等於 n/2 + n/4 + n/8 + n/16 + …,

根據上述分析,得到具體演算法,如下所示:

[cpp]view plain

copy

/*可以先求出n!中2的個數(因為每存在乙個2,則在數的 

最低位多1個0)。因此求1的最低位的位置即為n!中2的個數+1; 

*/int

lowestonepos(

intn)   

return

ret+1;  

}  

【問題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 末尾有多少個0

問題分析 對於n 想要知道其末尾有多少個0,則可以分解為問題能被多少個10整除,繼續分解,被10整除,則必能同時被2和5整除。則對n!進行質因數分解,n 2 x 3 y 5 z 可得n 2 p 5 q r,1z 一 則m 1 2 k,存在乙個k使得5 k n 二 則m n 5 n 5 2 n 5 k...

谷歌 1024 的末尾有多少個零

筆者自己算這道題目的時候,也是考慮到用 2 5 10來計算,但是卻忽略了5 n問題,比如125是可以產生3個零的,但是筆者還是按照乙個零來算,結果錯誤那是妥妥的。不要被階乘嚇倒 zero count 1024 5 1024 25 1024 125 1024 625 至於為什麼,請看下文。2.2 不要...

N 的末尾有多少個0?

n的階乘末尾有多少0呢?首先,得思考一下0到底是由哪些數貢獻的,顯而易見,乙個2和5能貢獻乙個0,然後我們只需要計算2和5的因子的個數即可,最後取最小值就是0的個數!n的階乘是從1到n的乘積,因子2的個數明顯多於5,只需要計算因子5的數量即可。1 n中5的倍數有n 5個,5 的倍數有n 5 個,5 ...