题解:洛谷 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
浙公网安备 33010602011771号