不要被階乘嚇倒

2021-08-30 23:16:36 字數 1219 閱讀 5967

題目:1.給定乙個整數n,求n!末尾有多少個0

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

對於第乙個問題,書中也給出了兩種解答方法,第二種是最好的,想明白為什麼這樣做後就很簡單了。

/**

* 1.給定乙個整數n,求n!末尾有多少個0 2.求n!的二進位制表示中最低位1的位置

*/public class factorial2_2

// 解法一,有多少個0,其實可以轉化成求因式分解後5的指數是多少

public static int zerocount1(int n)

} return res; }

//解法二,連續的k個數有且僅有1個數可以被k整除,如2,3,4,5,6肯定只有乙個5可以被5帶除

//如n=100時,可以把100,99,98....1五個五個分成一組,能分多少組就說明有多個數能被5整除

//接著計算有多少個數能被25,125...整除

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

public static int zerocount2(int n)

return res;

}}

第二個問題的解法和第乙個問題差不多,只不過是求2的質因數個數

//第二個問題實際上可以轉化成求n!中含有質因數2的個數,最後加上1即可,解法和求5的是一致的

public static int lowestone1(int n)

return res+1;

} //n!含有質因數2的個數,還等於n減去n的二進位制表示中1的數目

//這個思路比較難想~~

public static int lowestone2(int n)

//整數二進位制表示中1的個數,只需迴圈1的個數次即可

//每次迴圈都把最低位的1去掉了

public static int count3(int a)

return count;

}

擴充套件問題:給定整數n,判斷它是否為2的方冪

這個問題比較簡單,只要是2的方冪的數,二進位制表示都只有乙個1,前面講過n&(n-1)會把最低位的1變成0,因此只需要判斷n&(n-1)是否為0即可:

//判斷整數n是否為2的方冪

public static boolean ismitwo(int n)

不要被階乘嚇倒

階乘 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的階...