题232.pat甲级练习-1059 Prime Factors (25 分)
一、题目
二、题解
#include <bits/stdc++.h>
using namespace std;
const int maxn=1000000;
int cnt;
int p[maxn],vis[maxn];
void isPrime(int n)//这里采用线性筛法
{
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
p[++cnt]=i;
}
for(int j=1;j<=cnt;j++)
{
if(i*p[j]>n)
{
break;
}
vis[i*p[j]]=1;
if(i%p[j]==0)
{
break;
}
}
}
}
int main()
{
isPrime(maxn);//先得到素数表
int N;
cin>>N;
printf("%d=",N);
if(N==1)//单独处理N等于1的情况
{
printf("1");
return 0;
}
int n=0;
int lim=sqrt(N);
for(int i=1;i<=cnt;)//素数表中挨个遍历素数,看是否为当前N的因子
{
if(N%p[i]==0)
{
n++;
N/=p[i];
}
else
{
if(n==1)
{
printf("%d*",p[i]);
}
else if(n>1)
{
printf("%d^%d*",p[i],n);
}
i++;//当当前因子不能作为当前N因子了那就换下一个素数
n=0;//当前因子个数置零
}
if(N==1)//若当前N已经被除到变成1了,那么分解因子结束,做最后输出
{
if(n==1)
{
printf("%d",p[i]);
}
else if(n>1)
{
printf("%d^%d",p[i],n);
}
break;
}
if(p[i]>lim)//也有可能到N已经是素数,不可能被整除到1,该标志为探索素数到大于初始N的开根号的结果。单独做最后输出。
{
printf("%d",N);
break;
}
}
return 0;
}