题解:洛谷 P1304 哥德巴赫猜想

【题目来源】

洛谷:P1304 哥德巴赫猜想 - 洛谷(luogu.com.cn)

【题目描述】

输入一个偶数 \(N\),验证 \(4\sim N\) 所有偶数是否符合哥德巴赫猜想:任一大于 \(2\) 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 \(10\)\(10=3+7=5+5\),则 \(10=5+5\) 是错误答案。

【输入】

第一行输入一个正偶数 \(N\)

【输出】

输出 \(\frac{N-2}{2}\) 行。对于第 \(i\) 行:

首先先输出正偶数 \(2i+2\),然后输出等号,再输出加和为 \(2i+2\) 且第一个加数最小的两个质数,以加号隔开。

【输入样例】

10

【输出样例】

4=2+2
6=3+3
8=3+5
10=3+7

【核心思想】

  1. 问题分析:验证 \(4\)\(N\) 之间的所有偶数是否符合哥德巴赫猜想(即每个偶数可以分解为两个质数之和),对于每个偶数,输出第一个加数最小的分解方案。本质是质数判定 + 枚举搜索,对每个偶数从最小的质数 \(2\) 开始尝试,找到一对质数即可。

  2. 算法选择

    • 质数判定函数:使用试除法判断一个数是否为质数,只需检查到 \(\sqrt{n}\)
    • 枚举每个偶数:对于偶数 \(x\),从 \(i=2\) 开始递增,若 \(i\)\(x-i\) 都是质数,则输出 \(x=i+(x-i)\) 并终止当前偶数的搜索(因为 \(i\) 递增,第一个找到的就是第一个加数最小的方案)。
    • 复杂度:最坏情况下,每个偶数需要尝试 \(O(x)\) 次质数判定,每次判定 \(O(\sqrt{x})\),总复杂度约为 \(O(N^{3/2})\),对于 \(N \le 10000\) 完全可行。
  3. 关键步骤

    • 读入:读取 \(N\)
    • 遍历偶数:从 \(4\)\(N\),步长为 \(2\)
    • 寻找质数对:对当前偶数 \(x\),从 \(i=2\) 开始循环:
      • isPrime(i)isPrime(x-i),则输出并跳出。
    • 输出格式printf("%d=%d+%d\n", x, i, x-i)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N \cdot \sqrt{N})\),对于 \(N \le 10000\),约 \(10^6\) 次运算,可接受。
    • 空间复杂度:\(O(1)\)
  5. 哥德巴赫猜想与质数判定

    • 猜想验证:只需验证到给定的 \(N\),无需证明。
    • 最小加数:由于 \(i\)\(2\) 开始递增,第一个找到的 \(i\) 一定是最小的。
    • 质数判定优化:可使用筛法预处理质数表,但在 \(N=10000\) 时试除法已足够。
    • 适用场景:这类“验证数论猜想”的题目,是练习质数判定和循环控制的经典题。

【算法标签】

入门 #质数

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 判断一个数是否为素数
 * @param n 待判断的数字
 * @return 如果是素数返回true,否则返回false
 */
bool prime(int n)
{
    if (n <= 1)          // 小于等于1的数不是素数
        return false;

    // 检查从2到sqrt(n)是否有因数
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)  // 如果能被整除,不是素数
            return false;
    }
    return true;         // 否则是素数
}

/**
 * 验证哥德巴赫猜想(每个大于2的偶数可以表示为两个素数之和)
 * @param n 要验证的偶数
 */
void gold(int n)
{
    // 遍历所有可能的素数对
    for (int i = 2; i <= n; i++)
    {
        // 如果i和n-i都是素数
        if (prime(i) && prime(n - i))
        {
            printf("%d=%d+%d\n", n, i, n - i);  // 输出分解结果
            return;                             // 找到一个解即可返回
        }
    }
}

int main()
{
    int n;  // 定义变量:输入的上界

    cin >> n;  // 输入上界n

    // 对4到n之间的每个偶数验证哥德巴赫猜想
    for (int i = 4; i <= n; i += 2)
    {
        gold(i);  // 验证当前偶数
    }

    return 0;  // 程序正常结束
}

【运行结果】

10
4=2+2
6=3+3
8=3+5
10=3+7
posted @ 2026-08-31 09:24  团爸讲算法  阅读(26)  评论(0)    收藏  举报