题解:洛谷 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
【核心思想】
-
问题分析:验证 \(4\) 到 \(N\) 之间的所有偶数是否符合哥德巴赫猜想(即每个偶数可以分解为两个质数之和),对于每个偶数,输出第一个加数最小的分解方案。本质是质数判定 + 枚举搜索,对每个偶数从最小的质数 \(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\) 完全可行。
-
关键步骤:
- 读入:读取 \(N\)。
- 遍历偶数:从 \(4\) 到 \(N\),步长为 \(2\)。
- 寻找质数对:对当前偶数 \(x\),从 \(i=2\) 开始循环:
- 若
isPrime(i)且isPrime(x-i),则输出并跳出。
- 若
- 输出格式:
printf("%d=%d+%d\n", x, i, x-i)。
-
时间/空间复杂度:
- 时间复杂度:\(O(N \cdot \sqrt{N})\),对于 \(N \le 10000\),约 \(10^6\) 次运算,可接受。
- 空间复杂度:\(O(1)\)。
-
哥德巴赫猜想与质数判定:
- 猜想验证:只需验证到给定的 \(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
浙公网安备 33010602011771号