程式設計之美有一道關於階乘的題目:
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的階...