【题解】LibreOJ10200 Goldbach's Conjecture 线性筛

题目链接

题目描述

原题来自:Ulm Local,题面详见:POJ 2262

哥德巴赫猜想:任何大于 444 的偶数都可以拆成两个奇素数之和。 比如:
8 = 3 + 5 20 = 3 + 17 = 7 + 13 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 8=3+5\quad20=3+17=7+13\quad42=5+37=11+31=13+29=19+23

你的任务是:验证小于 1 0 6 10^6 的数满足哥德巴赫猜想。

输入格式

多组数据,每组数据一个 n n

读入以 0 0 结束。

输出格式

对于每组数据,输出形如 n = a + b n=a+b ,其中 a , b a,b 是奇素数。若有多组满足条件的 a , b a,b ,输出 b a b−a 最大的一组。
若无解,输出 G o l d b a c h s c o n j e c t u r e i s w r o n g . Goldbach's\quad conjecture\quad is\quad wrong.

样例

样例输入

8
20
42
0

样例输出

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

数据范围与提示

对于全部数据, 6 n 1 0 6 6\le n\le 10^6


线性筛出 1 0 6 10^6 以内素数,枚举都能过。不需要判断肯定有解。

扫描二维码关注公众号,回复: 3304446 查看本文章
#include<cstdio>
const int N=1e6+10;
int n,p,prime[N],iscomp[N];
void primetable()
{
	for(int i=2;i<N;i++)
	{
		if(!iscomp[i])prime[p++]=i;
		for(int j=0;j<p&&i*prime[j]<N;j++)
		{
			iscomp[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	primetable();
	while(scanf("%d",&n)&&n)
	{
		for(int i=1;i<p&&prime[i]+prime[i]<=n;i++)
		    if(!iscomp[n-prime[i]]){printf("%d = %d + %d\n",n,prime[i],n-prime[i]);break;}
	}
	return 0;
}

总结

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/82786437
今日推荐