题解:洛谷 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

【算法标签】

《洛谷 P1304 哥德巴赫猜想》 #搜索# #数学# #素数判断,质数,筛法#

【代码详解】

#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-02-16 18:12  团爸讲算法  阅读(5)  评论(0)    收藏  举报