不要被階乘嚇到

2021-09-30 12:52:00 字數 1805 閱讀 8841

程式設計之美有一道關於階乘的題目:

1給定乙個整數n,那麼n的階乘等於n!,末尾有多少個0呢,例如n=10,n!=3628800,n!的末尾有兩個0

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

階乘定義:n!

= }

return ret;

}解法二:

作者根據[n/k]等於1,2,3 ,…,n中能被k整除的數的個數規律,得出下面公式:

z=[n/5]+[n/52

]+[n/53

]+….(總存在乙個k,使得5k

>n,[n/5k

]=0)

公式中,[n/5]表示不大於n的數中5的倍數貢獻乙個5,[n/52

]表示不大於n的數中52

的倍數再貢獻乙個5…。

**實現:

#include 

using

namespace

std;

int findzero(int n)

return ret;

}

對於問題二,確實不好想到那方面去,我們都知道在計算機二進位制裡,有乙個規律,那就是如果乙個數是偶數,那麼該數的最後乙個二進位制必定是0,如果是奇數,那麼該數的最後乙個二進位制必定是1,這裡作者根據這樣的規律給了兩種解法。

解法一:

判斷最後乙個二進位制位是否為0,若為0,則將此二進位制數右移一位,即為商值;反之,若為1,則說明這個二進位制數是奇數,無法被2整除。

所以,這個問題實際上等同於求n!含有質因數2的個數。即答案等於n!含有質因數2的個數加1。

**實現:

#include 

using

namespace

std;

int lowestone(int n)

return ++ret;

}

解法二:

n!含有質因數2的個數,還等於n減去n的二進位制表示中1的數目。我們還可以通過這個規律來求解。

下面對這個規律進行舉例說明,假設 n = 11011,那麼n!中含有質因數2的個數為 n/2 + n/4 + n/8 + n/16 + …

即: 1101 + 110 + 11 + 1

=(1000 + 100 + 1)

+(100 + 10)

+(10 + 1)

+ 1

=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1

= 1111 + 111 + 1

=(10000 -1)+(1000 - 1)+(10-1)+(1-1)

= 11011-n二進位制表示中1的個數

**實現:

#include 

using

namespace

std;

int lowestone(int n)

ret=n-ret;

return ++ret;

}

不要被階乘嚇到

1.給定整數n,那麼n的階乘n 末尾有多少個0?這個問題經過質因子分解轉換為求5的指數 ret 0 for i 1 i n i n k 等於1,2,3.n中能被k整除的數的個數 證明 1,2,3.n中能被k整數的數為 k k 2 k 3 k 4 k n 其中 k 1 n n k n n 所以能被k整...

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

題目 1 給定乙個整數n,那麼階乘n 末尾有多少個0呢?2 求n 的二進位制表示中最低位1的位置?先來看怎麼計算階乘,當然可以是迴圈,也可以是遞迴,上 public long factorial1 int n return sum public long factorial2 int n retur...

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

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