题目地址:
https://www.acwing.com/problem/content/1294/
哥德巴赫猜想的内容如下:任意一个大于 4 4 4的偶数都可以拆成两个奇素数之和。例如:
8=3+5
20=3+17=7+13
42=5+37=11+31=13+29=19+23
现在,你的任务是验证所有小于一百万的偶数能否满足哥德巴赫猜想。
输入格式:
输入包含多组数据。
每组数据占一行,包含一个偶数
n
n
n。
读入以
0
0
0结束。
输出格式:
对于每组数据,输出形如
n
=
a
+
b
n = a + b
n=a+b,其中
a
,
b
a,b
a,b是奇素数。
若有多组满足条件的
a
,
b
a,b
a,b,输出
b
−
a
b−a
b−a最大的一组。
若无解,输出Goldbach's conjecture is wrong.
。
数据范围:
6
≤
n
<
1
0
6
6≤n<10^6
6≤n<106
先用线性筛筛出 1 ∼ 1 0 6 1\sim 10^6 1∼106的所有素数,然后对每个 n n n暴力判断即可。哥德巴赫猜想还没被证伪,所以不需要写无解的情形。代码如下:
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int p[N], idx;
bool st[N];
int main() {
for (int i = 2; i < N; i++) {
if (!st[i]) p[idx++] = i;
for (int j = 0; p[j] * i < N; j++) {
st[p[j] * i] = true;
if (i % p[j] == 0) break;
}
}
int n;
while (cin >> n, n) {
for (int i = 1;; i++) {
if (!st[n - p[i]]) {
printf("%d = %d + %d\n", n, p[i], n - p[i]);
break;
}
}
}
}
预处理时间复杂度 O ( N ) O(N) O(N), N N N为 n n n取值范围,每次询问时间复杂度 O ( N ln N ) O(\frac{N}{\ln N}) O(lnNN),空间 O ( N ) O(N) O(N)。