九度OJ-1207--質因數的個數

題目1207:質因數的個數

時間限制:1 秒

內存限制:32 兆

特殊判題:

提交:9302

解決:3019

題目描述:
求正整數N(N>1)的質因數的個數。
相同的質因數需要重複計算。如120=2*2*2*3*5,共有5個質因數。
輸入:

可能有多組測試數據,每組測試數據的輸入是一個正整數N,(1<N<10^9)。

輸出:

對於每組數據,輸出N的質因數的個數。

樣例輸入:
120
樣例輸出:
5
提示:

注意:1不是N的質因數;若N爲質數,N是N的質因數。

來源:
2007年清華大學計算機研究生機試真題

#include<iostream>
#include<stdio.h>
#define Max 100010
using namespace std;
bool Mark[Max];
int prime[Max];
int primesize; 
void Isprime(){
	for(int i=0;i<Max;i++){
		Mark[i]=false;
	}
	primesize=0;
	for(int i=2;i<Max;i++){
		if(!Mark[i]){    //如果是 
			prime[primesize++]=i;
			for(int j=i*2;j<Max;j+=i)
				prime[j]=true;
		}
	} 
} 
/*int Recycle(int x,int primenum,int count){    //循環除一個數,來判斷冪指數 
	if(x%primenum==0){
		count++;
		Recycle(x/primenum,primenum);
	}
	else{
		return count;
	}
}*/
//以下代碼思路來自參考書 
int main(){
	int n;
	Isprime();
	while(scanf("%d",&n)!=EOF){
		int ansPrime[30];   //按順序保存分解出來的素數 
		int ansSize=0;      //分解出來素因素的個數 
		int ansNum[30];     //保存分解出來的素因素對應的冪指數 
		for(int i=0;i<primesize;i++){   //依次測試每個素數 
			if(n%prime[i]==0){     // 
				ansPrime[ansSize]=prime[i];    //第ansSize個素數是prime[i] 
				ansNum[ansSize]=0;     //第ansSize個素數的冪指數是0,此時相當於初始化; 
				while(n%prime[i]==0){
					ansNum[ansSize]++;  //冪指數要增加了
					n/=prime[i];   //判斷該素因數的冪指數最大是多少 
				}
				ansSize++;  //該素因數判斷完了,準備記錄下一個素因數 
				if(n==1) break; 
			}
		}
		if(n!=1){   //如果測試完2-100000所有的素數n仍然沒有被分解爲1,則剩餘的因數一定是n,一個大於100000的素因數
			ansPrime[ansSize]=n;  //記錄該素因數,注意此時不用ansSize++因爲上面一個for循環中執行了ansSize++ 
			ansNum[ansSize++]=1;   //其冪指數只能是1,先執行ansNum[ansSize]再執行ansSize++,必須執行ansSize++ 
		}
		int ans=0;
		for(int i=0;i<ansSize;i++){
			ans+=ansNum[i];
		} 
		printf("%d\n",ans);
   }
   return 0;
}


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