不要被階乘嚇倒

2021-06-20 15:35:45 字數 1012 閱讀 6297

問題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的階乘中因式分解中5的指數。

解法1:

ret = 0;

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

}ret = 0;

解法2:

公式:z=[n/5]+[n/5^2]+[n/5^3]+.....      不用擔心這會是個無窮的運算,因為總存在乙個k使得5的k次方大於n,[n/5^k]=0

演算法說白了就是小於[n/5]的數會貢獻乙個5,因為他們乘以5後小於n;小於

[n/5^2]的數會再貢獻乙個5,因為它們乘以25後小於n,因為計算[n/5]的時候已經算過它們一次了,因此這裡只是再多貢獻乙個5,依次類推,

while(n)

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

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

n!中含有質因數2的個數

解法1:等於 n/2 + n/4 + n/8 + n/16 + …

int lowestone(int n)

return ret; 

}解法2:n!含有質因數2的個數

等於n減去n的二進位制表示中1的數目

求n的二進表示中1的數目可以參考這篇文章:

問題3:給定整數m,判斷它是否為2的方冪。

解法:乙個數如果是二的方冪,其二進位制表示中只有一位是1,例如4:100,8:1000 ,32:100000.

因此,可以根據求乙個數二進位制表示中1的個數問題中的解法求解:

判斷公式為:n>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...

不要被階乘嚇倒

階乘 factorial 是個很有意思的函式,但是不少人都比較怕它,我們來看看兩個與階 1.給定乙個整數n,那麼n的階乘n!末尾有多少個0呢?例如 n 10,n!3 628 800,n!的末尾有兩個0。2.求n!的二進位制表示中最低位1的位置。有些人碰到這樣的題目會想 是不是要完整計算出 n!的值?...