PAT A1059 Prime Factors
阿新 • • 發佈:2018-12-10
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1k1×p2k2×⋯×pmkm.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range of long int
Output Specification:
Factor N in the format N =
p1^
k1*
p2^
k2*
…*
pm^
km, where pi's are prime factors of N in increasing order, and the exponent ki is the number of pi -- hence when there is only one pi, ki is 1 and must NOT
Sample Input:
97532468
Sample Output:
97532468=2^2*11*17*101*1291
法一(埃氏篩法):
//PAT A1059 Prime Factors #include<cstdio> #include<cmath> const int maxn=100010; //此處數不能太大,否則會執行超時 int prime[maxn],num=0;//陣列prime[]用來存放素數,num表示素數的個數 bool p[maxn]={0}; //埃氏篩法,p[i]=false表示i是素數 void Find_Prime()//產生素數表 { for(int i=2;i<maxn;i++) { if(p[i]==false)//判斷等於是雙等號,經常粗心寫錯 { prime[num++]=i; for(int j=i+i;j<maxn;j+=i) { p[j]=true;//i的倍數都不是素數 } } } } struct factor{ int x,cnt;//x是質因子,cnt是質因子的個數 }fac[10];//對於int型的數 ,fac的大小隻需開到10就好 int main() { int n; scanf("%d",&n); int sqr=(int)sqrt(1.0*n); if(n==1) printf("1=1");//注意注意,此處是特判 else{ printf("%d=",n); int pnum=0;//pnum表示質因子的個數 Find_Prime(); for(int i=0;i<num&&prime[i]<=sqr;i++) { if(n%prime[i]==0)//表示prime[i]是n的質因子 { fac[pnum].x=prime[i]; fac[pnum].cnt=0;//每次對其初始化 while(n%prime[i]==0) { fac[pnum].cnt++; n/=prime[i]; } pnum++;//另一個質因子,一定要放在while外,if內 } if(n==1) break;//及時退出迴圈,節省點時間 } if(n!=1)//表明有且存在一個大於sqrt(n)的質因子 { fac[pnum].x=n; fac[pnum++].cnt=1; //此處一定要寫pnum++,否則會輸出不了結果,因為在下面for中i<pnum } for(int i=0;i<pnum;i++) { // if(i>0) printf("*"); // printf("%d",fac[i].x); // if(fac[i].cnt>1) // printf("^%d",fac[i].cnt); (法二) if(fac[i].cnt>1) { printf("%d^%d",fac[i].x,fac[i].cnt); }else{ printf("%d",fac[i].x); } if(i!=pnum-1) printf("*"); } } return 0; }
注意:
- const int maxn=100010; //此處數不能太大,否則會執行超時 錯誤想法認為maxn一定要比測試用例輸入的n=97532468要大,其實不是的,我們只需獲取一部分素數表就可以了,因為獲得質因子只需在小於的範圍內找
- if(n==1) printf("1=1");//注意注意,此處是特判
- pnum++;//另一個質因子,一定要放在while外,if內
- fac[pnum++].cnt=1; //此處一定要寫pnum++,否則會輸出不了結果,因為在下面for中i<pnum
//一般做法
#include<cstdio>
#include<cmath>
const int maxn=10010;
int prime[maxn],num=0;
bool isPrime(int n)
{
if(n==1) return false;
int sqr=(int)sqrt(1.0*n);
for(int i=2;i<=sqr;i++)
{
if(n%i==0) return false;
}
return true;
}
void Find_Prime()
{
for(int i=2;i<maxn;i++)
{
if(isPrime(i)==true)
{
prime[num++]=i;
}
}
}
struct factor{
int x,cnt;
}fac[10];
int main()
{
int n,pnum=0;
scanf("%d",&n);
if(n==1) printf("1=1");
else{
printf("%d=",n);
int sqr=(int)sqrt(1.0*n);
Find_Prime();
for(int i=0;i<num&&prime[i]<=sqr;i++)
{
if(n%prime[i]==0)
{
fac[pnum].x=prime[i];
fac[pnum].cnt=0;
while(n%prime[i]==0)
{
fac[pnum].cnt++;//fac[num].cnt++;錯
n/=prime[i];
}
pnum++;
}
if(n==1) break;
}
if(n!=1)
{
fac[pnum].x=n;
fac[pnum++].cnt=1;
}
for(int i=0;i<pnum;i++)
{
if(i>0) printf("*");
printf("%d",fac[i].x);
if(fac[i].cnt>1)
printf("^%d",fac[i].cnt);
}
}
return 0;
}
注意:
- 函式開頭一定要先呼叫Find_Prime()函式呀!!!!!
- 碼程式碼一定要細心呀,fac[pnum].cnt++;//fac[num].cnt++;錯 ,把pnum寫成num導致出錯,而且把程式碼查了好幾遍,才找到這個錯誤,這是太粗心了。