欢迎来到endl的博客hhh☀☾☽♡♥

浏览器标题切换
把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

Goldbach’s Conjecture(信息学奥赛一本通 1622)

【题目描述】

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

哥德巴赫猜想:任何大于 44 的偶数都可以拆成两个奇素数之和。 比如:

8=3+5
20=3+17=7+13
42=5+37=11+31=13+29=19+23

你的任务是:验证小于 106 的数满足哥德巴赫猜想。

【输入】

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

读入以 0 结束。

【输出】

对于每组数据,输出形如 n=a+b,其中 a,b 是奇素数。若有多组满足条件的 a,b,输出 b−a 最大的一组。

若无解,输出 Goldbachs conjecture is wrong.

【输入样例】

8
20
42
0

【输出样例】

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

【提示】

数据范围与提示:

对于全部数据,6≤n≤106 。


 

典型模板题...用欧拉筛真的肥肠简单

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e6+1;
 4 int a[N],n,cnt,v[N];
 5 int read()
 6 {
 7     int x=0,f=1;
 8     char ch=getchar();
 9     while(ch<'0'||ch>'9')
10     {
11         if(ch=='-') f=-1;
12         ch=getchar();
13     }
14     while(ch>='0'&&ch<='9')
15     {
16         x=x*10+ch-'0';
17         ch=getchar();
18     }
19     return x*f;
20 }
21 void write(int x)
22 {
23     if(x<0)
24     {
25         putchar('-');
26         x=-x;
27     }
28     if(x>9) write(x/10);
29     putchar(x%10+'0');
30 }
31 void pre()
32 {
33     for(int i=2;i<=1000000;i++)
34     {
35         if(!v[i])a[++cnt]=i;
36         for(int j=1;j<=cnt&&a[j]*i<=1000000;j++)
37         {
38             v[i*a[j]]=1;
39             if(i%a[j]==0)break;
40         }
41     }
42 }
43 int main()
44 {
45     pre();
46     while(1)
47     {
48         n=read();
49         if(!n)break;
50         bool flag=0;
51         for(int i=2;i<=cnt&&i<n;i++)
52             if(!v[n-a[i]])
53             {
54                 printf("%d = %d + %d\n",n,a[i],n-a[i]);
55                 flag=1;break;
56             }
57         if(!flag)puts("Goldbach's conjecture is wrong.");
58     }
59     
60     return 0;
61 }

 

posted @ 2019-08-19 17:07  endl\n  阅读(522)  评论(0编辑  收藏  举报