時間限制: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; }