[PAT A1059 Prime Factors]
Description:
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 be printed out.
Sample Input:
97532468
Sample Output:
97
CODE:
#include <cstdio>
#include <cmath>
const int maxk=20;
int p[maxk];
int exponent[maxk];
//这里需要大一些,避免出现num%0
const int maxn=10000;
int prime[maxn]={0};
void get_prime(){
int cnt=0;
for(int i=2;i<maxn;i++){
int sqr=sqrt(i);
bool flag=true;
for(int j=2;j<=sqr;j++){
if(i%j==0){
flag=false;
break;
}
}
if(flag)prime[cnt++]=i;
}
}
int main(){
long int num;
scanf("%ld",&num);
//对于num=1,由于prime中没有1来给num除,需要单独输出
if(num==1){
printf("1=1");
return 0;
}
printf("%ld=",num);
get_prime();
int sqr=sqrt(num);
int pNum=0;
//这里是<=sqr,不要忘记等号
for(int i=0;prime[i]<=sqr;i++){
if(num%prime[i]==0){
p[pNum]=prime[i];
while(num%prime[i]==0){
exponent[pNum]++;
num=num/prime[i];
}
pNum++;
}
//若已经num=1,提前退出
if(num==1)break;
}
//若有超过sqr的因数,需要加上
if(num!=1){
p[pNum]=num;
exponent[pNum]=1;
}
//对于5,7此时pNum=0,下面的for循环没有输出,因此加一
if(pNum==0)pNum++;
for(int i=0;i<pNum;i++){
printf("%d",p[i]);
if(exponent[i]!=1)
printf("^%d",exponent[i]);
if(i!=pNum-1)printf("*");
}
return 0;
}
注意点:
在有了上一篇找素数的基础上,分解质因子,可以利用上一篇得到的素数表相除,从小到大到得到质因子
1)需要注意的一点是:一个数的质因子要么全小于等于他的开方;要么仅有一个大于它的开方,其他均比开方小
2)这个code AC满分并不容易,有几点要注意:
a .对于num=1,由于prime中没有1来给num除,需要单独输出 (num=1出错)
b.prime[i]<=sqr,这里不要忘记等号(num=9出错)
c.对于5,7此时pNum=0,下面的for循环没有输出,因此加一(num=5,7出错)
d.maxn=1000000,这里maxn可以取大一点,否则num%prime[i]中,当素数表填充的不够满时,prime[i]这里可能不是素数而是0,此时会发生浮点错误
3)对于int/long int类型,素数表的前十个相乘就会超过范围;素数表开到1e5即可(老相识了)