int ms =(int)sqrt(2^31-1)+1;
cin>>x;//x 是输入的数
0.打表
1.不用保存大于 ms 的素数,后期绕晕了。 记得筛选素数的时候到i*i<=x就行了。
2.不能直接判断x是不是在isprime里面,否则会造成RE,因为isprime[x>ms]会造成数组越界。
3.有时候直接判断特殊情况可以减少工作量,但会牺牲代码简洁性(便于查错)。
4.细节处理
……
#include<bits/stdc++.h>
using namespace std;
#define MAXN 47000
int su[MAXN];
bool isprime[MAXN];
int cnt=1;
//获得素数
void getp()
{
int i,j;
isprime[0]=isprime[1]=0;
for(i=2;i<MAXN;i++)
{
if(isprime[i])
su[cnt++]=i;
for(j=1;j<cnt&&su[j]*i<MAXN;j++)
{
isprime[su[j]*i]=0;
}
}
}
int main()
{
int i;
for(i=0;i<MAXN;i++)
{
isprime[i]=1;
}
getp();
int x;
//当有输入并且输入不为0时
while(~scanf("%d",&x)&&x)
{
int first=1;
printf("%d =",x);
//x是负数就先输出-1,并取反,置first=0
if(x<0)
{
x=-x;
printf(" -1",x);
first=0;
}
//如果有的除,就一直除;如果除到1,分解完毕
for(i=1;i<cnt;)
{
if(x==1) break;
if(x%su[i]==0)
{
if(first)
{
first=0;
printf(" %d",su[i]);
}
else
printf(" x %d",su[i]);
x/=su[i];
}
else
{
i++;
}
}
//如果经过前面的还没被除到一,说明这是一个很大的素数(大于2^31-1的平方根)
if(x!=1)
{
if(first) printf(" %d",x);
else printf(" x %d",x);
}
cout<<endl;
}
return 0;
}