<—点个赞吧QwQ
宣传一下算法提高课整理{:target=”_blank”}
哥德巴赫猜想的内容如下:
任意一个大于 $4$ 的偶数都可以拆成两个奇素数之和。
例如:
$8 = 3 + 5$
$20 = 3 + 17 = 7 + 13$
$42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23$
现在,你的任务是验证所有小于一百万的偶数能否满足哥德巴赫猜想。
输入格式
输入包含多组数据。
每组数据占一行,包含一个偶数 $n$。
读入以 $0$ 结束。
输出格式
对于每组数据,输出形如 n = a + b
,其中 $a,b$ 是奇素数。
若有多组满足条件的 $a,b$,输出 $b-a$ 最大的一组。
若无解,输出 Goldbach's conjecture is wrong.
。
数据范围
$6 \\le n < 10^6$
输入样例:
8
20
42
0
输出样例:
8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
思路
枚举所有质数即可。
注意数据范围内哥德巴赫猜想一定有解,所以。。。偷懒,懒得特判
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1000010;
int n;
int primes[N],cnt;
bool is_prime[N];
void get_primes (int n) {
memset (is_prime,true,sizeof (is_prime));
is_prime[1] = false;
for (int i = 2;i <= n;i++) {
if (is_prime[i]) primes[++cnt] = i;
for (int j = 1;primes[j] * i <= n;j++) {
is_prime[primes[j] * i] = false;
if (i % primes[j] == 0) break;
}
}
}
int main () {
get_primes (N - 1);
while (cin >> n,n) {
for (int i = 1;i <= cnt;i++) {
if (is_prime[n - primes[i]]) {
cout << n << " = " << primes[i] << " + " << n - primes[i] << endl;
break;
}
}
}
return 0;
}