這題剛開始想的時候,是覺得只要計算偶數,比如5!,只要考慮2,4中含有因子2的個數,再加起來。但看到“輸入一個整數n(n<400000)”,考慮到時間複雜度會超。
其實可以這樣考慮,比如計算8!,其中含有2因子的有三種,一種是隻含有因子2(2,6),一中是含有因子4,也就是2個因子2(4),一種是含有因子8,也就是3個因子2(8)每次迭代將n變爲n/2,迭代直到商爲1的時候停止。
所以直接用8除以2的商 + 4除以2的商 + 2除以2的商 = 8!含有因子2的個數
源代碼(C++)
// 輸入一個整數n(n<400000),輸出n!中含有因子2的個數
#include <iostream>
using namespace std;
void main(){
int n;
while(cin>>n){
int sum = 0;
while(n/2!=1){
sum += n/2;
n = n/2;
}
sum += 1;
cout<<sum<<endl;
}
}
============= update by 2015/1/7 =================
昨晚跟師兄討論了這道題,又提出了另一題“如何判斷階乘中含有0的個數?”
思路:這題關鍵在於0是如何產生的,不可能是0*X,只有是2*5這種情況。
算法:階乘中含有因子2個數和因子5個數的最小值,即爲階乘中含有0的個數
舉個例子,5!= 5*4*3*2*1 = 120,含有1個0,而含有因子2的個數爲2+1=3,含有因子5的個數爲1,取兩者最小值即爲階乘結果含有0的個數
其實很好理解,只有1個2和1個5相乘才能組成10,所以肯定是取階乘中含因子2個數和因子5個數的最小值。