哥德巴赫的另一个猜想
克里斯蒂安·哥德巴赫曾经猜想,每个奇合数可以写成一个素数和一个平方的两倍之和。
9 = 7 + 2×12
15 = 7 + 2×22
21 = 3 + 2×32
25 = 7 + 2×32
27 = 19 + 2×22
33 = 31 + 2×12
最终这个猜想被推翻了。
最小的不能写成一个素数和一个平方的两倍之和的奇合数是多少?
代码演示
#include <iostream>
using namespace std;
#define MAX_N 1000000
int prime[MAX_N + 5] = {0};
int is_prime[MAX_N + 5] = {0};
void init() {
for (int i = 2; i <= MAX_N; i++) {
if (!is_prime[i]) prime[++prime[0]] = i;
for (int j = 1; j <= prime[0]; j++) {
if (prime[j] * i > MAX_N) break;
is_prime[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
return ;
}
int sqrt(int n) {
return 2 * n * n;
}
bool binary_search(int (*func)(int), int l, int r, int x) {
if (l > r) return false;
int mid = (l + r) >> 1;
if (func(mid) == x) return true;
if (func(mid) < x) l = mid + 1;
else r = mid - 1;
return binary_search(func, l, r, x);
}
bool check(int n) {
for (int j = 1; j <= prime[0] && prime[j] < n; j++) {
if (binary_search(sqrt, 1, n - prime[j], n - prime[j])) return true;
}
return false;
}
int main() {
init();
int ans = 0;
for (int i = 9; i <= MAX_N; i += 2) {
if (!is_prime[i]) continue;
if (check(i)) continue;
ans = i;
break;
}
cout << ans << endl;
return 0;
}