代码如下:
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100001;
int prime[maxn],p[maxn]={0},pNum=0;
struct factor{
int x,count;//质因子和其个数
}fac[10];
void FindPrime(){
int i;
for(i=2;i<maxn;i++){
if(p[i]==0){
prime[++pNum]=i;
int j;
for(j=i+i;j<maxn;j+=i){
p[j]=1;
}
}
}
}
void FindFactor(int n){
int i,j=0;
int s=sqrt(1.0*n);
if(n==1){
fac[0].x=1;
fac[0].count=1;
}
else{
for(i=1;i<=pNum&&prime[i]<=s;i++){
if(n%prime[i]==0){
fac[j].x=prime[i];
fac[j].count=0;
while(n%prime[i]==0){
fac[j].count++;
n/=prime[i];
}
j++;
}
if(n==1) break;//及时退出节省时间
}
if(n!=1){
fac[j].x=n;
fac[j].count=1;
j++;
}
}
}
int main(){
int n;
cin>>n;
FindPrime();
int i;
FindFactor(n);
cout<<n<<"=";
for(i=0;i<10;i++){
if(fac[i].count==1)
cout<<fac[i].x;
else if(fac[i].count>1)
cout<<fac[i].x<<"^"<<fac[i].count;
if(i<9&&fac[i+1].count!=0)
cout<<"*";
}
return 0;
}
需要注意很多细节:
1.当n==1时,需要特判。
2.记得处理大于sqrt(n)的质因子。
3.需要在循环外定义变量存储sqrt(n)。因为n是不断变化的。
4.素数表大概开1e5大小。fac数组开到10即可。