1 条题解
-
0
思路与算法
逐个处理6、8、…、100。对当前偶数n,从a=2开始尝试,若a与n-a都是素数,就输出n=a+(n-a)并停止本次内层搜索。
正确性说明
试除保证两个加数素性。从小到大寻找a并在第一次成功后停止,故第一加数在所有合法分拆中最小。a只需枚举至n/2,因为更大的a会对应已经考虑过的交换数对。固定范围内每个偶数的存在性已独立有限枚举验证。
复杂度
总共48个固定偶数,候选及试除上界均固定,实际时间和空间O(1)。若把上界视为B,朴素过程上界O(B²√B);本题无需存表,局部变量初始化O(1)。
易错点
从6开始,不能额外输出4=2+2。每个偶数只输出一行,无空格的n=a+b格式。库内J0110从4至输入N,属于不同的输入与输出范围。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; bool prime(int n) { if (n < 2) return false; for (int d = 2; d * d <= n; ++d) if (n % d == 0) return false; return true; } int main() { for (int n = 6; n <= 100; n += 2) for (int a = 2; a <= n / 2; ++a) if (prime(a) && prime(n - a)) { cout << n << "=" << a << "+" << n - a << "\n"; break; } }
- 1