poj 2262 Goldbach's Conjecture 题目链接:http://poj.org/problem?id=2262
数学水
background knowledge:哥德巴赫猜想,每个合数都能写成两个质数之和的形式。
题目大意:验证百万以内哥德巴赫猜想的正确性(还好是验证不是证明,不然就要请景润先生吃个饭了)。
题目分析:简单的素数打表就能解决。输入n,从i=3开始找(到n/2结束),如果i和n-i都是素数,那么这就是答案了(最后记得要出循环)。
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,n;
bool prime[1000010]={true};
memset(prime,true,sizeof(prime));
for(i=2;i<sizeof(prime);i++)
{
if(prime[i]==true)
for(j=2*i;j<sizeof(prime);j+=i)
{
prime[j]=false;
//if(j==2*i)printf("%d ",i);
}
}
while(scanf("%d",&n)!=EOF&&n)
{
for(i=3;i<=n/2;i++)
{
if(prime[i]&&prime[n-i])
{
printf("%d = %d + %d\n",n,i,n-i);
i=n;
}
}
}
return 0;
}
PS:其实打表有两种(我就总结出两种),其一,数组内存的元素全是素数(a[0]里存的“2”,a[1]里存的“3”……,a[n]里存的是第n个素数);其二,全描述法(自己诌的名字),元素下标表示了要描述的数,若元素内容为0||false||……,那么这个数就不是素数,反之,就是素数。两种方法各有优劣,本题采用了第二种打表方法(个人认为这种更为合适)。