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

2021-10-17 19:22:11 字數 2210 閱讀 9087

題目: 1:給定乙個整數n,那麼n的階乘n!末尾有多少個0?例如n = 10,n!= 3628800,末尾有兩個0. 2:求n!的二進位制表示中最低位1的位置。 問題一: 題目解析: 這道題如果直接求n!的話也可以,不過萬一溢位了怎麼辦?即使定義longlong型別的也不合適。那

題目:1:給定乙個整數n,那麼n的階乘n!末尾有多少個0?例如n = 10,n!= 3628800,末尾有兩個0.

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

問題一:

題目解析:

這道題如果直接求n!的話也可以,不過萬一溢位了怎麼辦?即使定義longlong型別的也不合適。那麼就要找尋其中的規律,一般這類題目都可以通過分析,找到乙個很簡單的方法。

思路一:

我們想想0是怎麼來的?乘以10就增加乙個0,而10可以通過2*5的來。好了,我們將n!表示式表達出來,看能獲得多少個2*5。n! = 2^x * 3^y * 5^z... 由於2比5小,所以x比z要大。所以看n!中有多少個5就可以了。

int count(int n)

int num = 0;

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

int j = i;

while(j%5 == 0){

num++;

j /= 5;

思路二:

我們可以利用公式z = [n/5] + [n/(5^2)] + [n/(5^3)] +....

這個公式表達什麼意思呢?n/5表示從1-n中有多少個數是5的倍數,那麼這些數,每乙個都貢獻乙個5;好了但是對於25會貢獻兩個,在除以5的時候,已經算進去1個,那麼n/(5^2)的時候,看看有多少是25的倍數,也算一下,這時將25中的另乙個5給算進去了;同理對於75,當我們n/75的時候,正好把三個5全算進去……通過這個方法,更簡化程式的實現。

int count1(int n)

int num = 0;

while(n){

num += n/5; //這種方法更簡潔,避免了附設變數

n = n/5;

return num;

問題二:

說白了,問題2跟問題1是一樣的,求n!2的倍數。

思路一:

根據上題的情況,寫出如下表示式求表示式n! = 2^x * 3^y * 5^z... 我們要求x的值為多少。也可以通過遍歷1-n乙個乙個求解

int count2(int n)

int num = 0;

for(int i =0;i < n;++i){

int j = i;

while(j%2 == 0){

num++;

j = j/2;

return num;

//當然可以通過位來操作

int count_2(int n)

int num = 0;

for(int i =0;i < n;++i){

int j = i;

while(!(j & 1)){

num++;

j = j >> 1;

return num;

思路二:

類似問題一中的公式,我們也可以寫出z = [n/2] + [n/(2^2)] + [n/(2^3)] +....

int count3(int n)

int num = 0;

while(n){

n = n >> 1;

num += n; //這句話寫在下面,更好

return num;

思路三:

n!含有質因數2的個數,還等於n減去n的二進位制表示中1的數目。——這是一種巧妙的方法,是根據z = [n/2] + [n/(2^2)] + [n/(2^3)] +....運算得到的,因為除以2,相當於右移一位,對於11011我們有:

z = 1101 + 110 + 11 + 1 = (1000 + 100 + 1) + (100 + 10) + (10 +1) + 1

= 1111 + 111 + 1 = (10000 - 1) + (1000 - 1) + (10 - 1) + (1 - 1) = 11011 - (n二進位制中1的個數)

給定整數n,判斷它是否為2的方冪。

(2的方冪為2^x。所以表示為二進位制的時候,只有一位為1,那麼利用判斷二進位制的個數的方法來判斷: 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的時候就會引起溢位,所以雖然這是乙個正確的方法,但在實際中卻不能使用。這時就需要...

程式設計之美 2 2 階乘

題目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...