題目1:找出n!中末尾0的個數。
#include //輸入n 輸出n!中末尾0的個數
//分析:只需要知道n!中質因子5出現了多少次 因為2*5 = 10 因子2比5多 只需要關注5
//方法1: 對1...n的每個數字 迴圈除以5 相加得到總共因子5的個數
//注意:像25這樣的數字提供了2個5
int numofzero1(int
n) }
return
ans;}//
方法2: 總共因子5出現的個數 = 小於等於n的中5的倍數的數字的個數 + 小於等於n/5中5的倍數的數字的個數 + 小於等於n/25中5的倍數的數字的個數 +....
//其實就是每個可以除開5的數字貢獻了乙個5,可以除開25的又多貢獻了乙個5...
//方法2快一些
int numofzero2(int
n)
return
ans;
}int
main()
題目2:找到n!的二進位制表示中最低位1的位置。
這個我沒做出來,還有最開始看題不仔細,當成10進製的了,要注意仔細讀題。
書上答案:考慮除以2操作。 若2進製最低位為0,除以2就是右移1位,若最低位是1,則除不開2. 故最低1的位置就是 n!可以除開2的次數+1
方法1:跟上面題目的一樣,不過是因子5換成了因子2而已 最後再加個1
方法2:n!中因子2的個數還等於 n - n的2進製表示中1的個數
int lowestone1(intn)
return ans + 1;}
int lowestone2(int
n)int
main()
題目3:判斷乙個數是否是2的冪
思路:2的冪肯定其2進製表示只有最高位1個1,並且數字必須大於0 故 判斷條件為
(n > 0 && n&(n - 1) == 0)
程式設計之美2 2 不要被階乘嚇倒
對n 進行質因數分解,n 可以分解成2 x 3 y 5 z 只有2 5才會使n 的末尾產生1個0,也就是說n 的質因數分解中有多少個2,5對末尾就有多少個0,而n 的質因數中5的個數要少於2的 個數,也就是說2,5對的個數取決於質因中5的個數,所以問題轉化為求n 中質因數5的個數 5的個數z n 5...
程式設計之美 2 2 不要被階乘嚇倒
題目 1.給定乙個整數n,那麼n的階乘n!末尾有多少個0?2.求n 的二進位制表示中最低位1的位置。分析與解答 對於題目1 最簡單直接的方法,算出n!再看10的倍數關係。複雜度雖然不高,但致命的問題是溢位。在n不到100的時候就會引起溢位,所以雖然這是乙個正確的方法,但在實際中卻不能使用。這時就需要...
階乘MySQL 程式設計之美 2 2不要被階乘嚇到
題目 1 給定乙個整數n,那麼n的階乘n!末尾有多少個0?例如n 10,n!3628800,末尾有兩個0.2 求n!的二進位制表示中最低位1的位置。問題一 題目解析 這道題如果直接求n!的話也可以,不過萬一溢位了怎麼辦?即使定義longlong型別的也不合適。那 題目 1 給定乙個整數n,那麼n的階...