題目: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的階...