13 条题解
-
1
#include <iostream> #include <vector> using namespace std; const int MAXN = 1e6 + 5; vector<bool> isPrime(MAXN, true); // 埃拉托斯特尼筛法求素数 void sieve() { isPrime[0] = isPrime[1] = false; for (int i = 2; i * i < MAXN; i++) { if (isPrime[i]) { for (int j = i * i; j < MAXN; j += i) { isPrime[j] = false; } } } } // 验证哥德巴赫猜想 void verifyGoldbach(int n) { for (int a = 3; a <= n / 2; a += 2) { int b = n - a; if (isPrime[a] && isPrime[b]) { cout << n << " = " << a << " + " << b << endl; return; } } cout << "Goldbach's conjecture is wrong" << endl; } int main() { sieve(); int n; while (cin >> n && n != 0) { verifyGoldbach(n); } return 0; }
这道题的核心是验证哥德巴赫猜想,对于输入的偶数,要把它拆成两个奇素数之和,并且在有多组解时输出两素数差值最大的那一组。可以先找出所有小于给定数的素数,再去遍历找出符合条件的素数对。 代码解释: 埃拉托斯特尼筛法:借助sieve函数来找出所有小于MAXN的素数,把结果存于isPrime数组中。 验证哥德巴赫猜想:verifyGoldbach函数从 3 开始遍历奇数a,计算b = n - a,若a和b都是素数,就输出结果并返回。 主函数:先调用sieve函数预处理素数,接着持续读取输入,直至遇到 0 为止,对每个输入调用verifyGoldbach函数进行验证。 复杂度分析: 时间复杂度:筛法的时间复杂度为:O(NloglogN) 对于每组数据,验证的时间复杂度为 O(N) 空间复杂度: O(N) 主要用于存储素数标记数组。
信息
- ID
- 197
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 662
- 已通过
- 240
- 上传者