13 条题解

  • 1
    @ 2025-4-12 9:01:10
    #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
    上传者