chenchenwwww @ 2020-02-24 22:23:52
//要证明一个奇数为三个质数组成
//奇 = 3*奇数 或者 = 偶数*2 +奇数 偶数中只有二为质数
int A[2000]={0}; //存质数
#include<cstdio>
int es_seletion(int n)//A[]用于储存前2-n中的素数
{
bool vis[n+1];
for(int i=0;i<=n;i++) vis[i] = 1;//初始化,若vis[i]=1, 则i为质数
for(int i = 2;i*i<=n;i++)
{
if(vis[i])for(int j=2*i;j<=n;j+=i)//如果i为质数,则将它的倍数筛掉
{
vis[j] = 0;
}
}
int k = 0;
for(int i = 2;i<=n;i++)
{
if(vis[i])
{
A[k] = i;
k++;
}
}
return k;//返回2-n中有多少的质数
}
bool isprimer(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
return false;
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
if(isprimer(n-4)) {printf("%d %d %d",2,2,n-4);return 0;}
int k = es_seletion(n);
for(int i=1;i<k;i++)
{
for(int j=1;j<k;j++)
{
if(isprimer(n-A[i]-A[j])) {printf("%d %d %d\n",A[i],A[j],n-A[i]-A[j]);return 0;}
}
}
}
by Computer1828 @ 2020-02-24 22:26:13
数组开大点?
by chenchenwwww @ 2020-02-25 15:55:39
@拥抱渴望者 还真是数组问题,谢谢!!
by 张慧婷1108 @ 2020-11-26 00:18:47
“for(int i=0;i<=n;i++) vis[i] = 1; //初始化,若vis[i]=1, 则i为质数 ”
楼主,想问问这一步是如何实现的?为什么是质数就会输出1呢