注意:
1.对于输入为1的情况要特判
2.factor在int范围内开到10就足够
3.sqrt是范围,由于n后面被修改故范围要单写,且sqrt是double
int sqr=sqrt(1.0*n);
4.按照prime中的素数寻找时,当n==1是要退出
5.对于本身是素数的寻找过程,由于寻找范围只在sqrt内,因此循环过程后n不变,因此要特判
#include <cstdio>
#include <math.h>
#define MAX 100000
int prime[MAX];
bool p[MAX]={0};
int cnt=0;
void findp(){
for(int i=2;i<MAX;i++){
if(p[i]==false){
prime[cnt++]=i;
for(int j=i+i;j<MAX;j+=i){
p[j]=true;
}
}
}
}
struct factor{
int x,cnt;
factor(){
x=1;
cnt=0;
}
}fac[10];
int main(){
freopen("in.txt","r",stdin);
findp();
int n;
while(scanf("%d",&n)!=EOF){
//立刻打印,后面n变了
if(n==1){
printf("1=1\n");
}else{
//遍历次数要单独写,因为后面n会变化
//sqrt中时double,因此要写成sqrt(1.0*n)
printf("%d=",n);
int sqr=(int)sqrt(1.0*n);
int facnt=0;
for(int i=0;prime[i]<sqr && i<cnt;i++){
if(n%prime[i]==0){
fac[facnt].x=prime[i];
while(n%prime[i]==0){
fac[facnt].cnt++;
n/=prime[i];
}
facnt++;
}
//及时退出,节省时间
if(n==1){
break;
}
}
//对于本身是质因数的数字上述过程后,n不发生变化,因此只要写入n即可
if(n!=1){
fac[facnt].x=n;
fac[facnt].cnt=1;
facnt++;
}
for(int i=0;i<facnt-1;i++){
if(fac[i].cnt==1){
printf("%d*",fac[i].x);
}else{
printf("%d^%d*",fac[i].x,fac[i].cnt);
}
}
if(fac[facnt-1].cnt==1){
printf("%d\n",fac[facnt-1].x);
}else{
printf("%d^%d\n",fac[facnt-1].x,fac[facnt-1].cnt);
}
}
}
return 0;
}