程式設計之美2 2 不要被階乘嚇倒

2021-06-07 01:30:30 字數 741 閱讀 8455

對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] + [n/5^2] + [n/5^3} + ...

[n/5] 表示不大於n的數中5的倍數貢獻乙個5,[n/5^2]表示不大於n的數中5^2的倍數再貢獻乙個5

32!= 1 * 2 * 3 * ...*31*32,其中5,10,15,20,30各貢獻1個5,25貢獻2個5,共7個5

int numof0(int n)

return result;

}

從右向左從1 數起

乙個數的二進位制表示中如果最後是m個0,則這個數有m個質因數2,如36的二進位制表示為

100100,它最後有2個0,36=2*2*9,可以看到有2個2,則最低位的1,只比質因數2的個

數多乙個,它在第2+1=3位

題目轉化為求n!中含有質因數的個數,等於[n/2]+[n/4]+[n/8]+[n/16]+...

[n/2]表示不大於n的數中所有2的倍數貢獻乙個2*/

int lowestone(int n)

return result;

}

程式設計之美 2 2 不要被階乘嚇倒

題目 1.給定乙個整數n,那麼n的階乘n!末尾有多少個0?2.求n 的二進位制表示中最低位1的位置。分析與解答 對於題目1 最簡單直接的方法,算出n!再看10的倍數關係。複雜度雖然不高,但致命的問題是溢位。在n不到100的時候就會引起溢位,所以雖然這是乙個正確的方法,但在實際中卻不能使用。這時就需要...

程式設計之美 不要被階乘嚇倒

問題1描述 給定整數n,n求n!末尾有幾個0。例如n 10,n!3628800,n!末尾有兩個0 分析 一 將n!分解質因數,n!2 x 3 y 5 z 由於10 2 5,所以問題也就是求m min x,z 容易看出x大於等於z,所以也就是求z include int main printf d n...

程式設計之美讀書筆記2 2 不要被階乘嚇倒

問題 1 給定乙個整數n,那麼n的階乘n 末尾有多少個0呢?例如 n 10,n 3 628 800,n 的末尾有兩個0。2 求n 的二進位制表示中最低位1的位置。3 給定整數n,判斷它是否為2的方冪 問題1詳解 解法1 解法2 using namespace std int m1 int n ret...