工大C++ 精品課程上機考(第三題) - 階乘中含因子2的個數



這題剛開始想的時候,是覺得只要計算偶數,比如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個數的最小值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章