1 条题解

  • 0
    @ 2026-10-26 13:21:31

    思路与算法

    逐个处理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

    信息

    ID
    1753
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者