二级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++二级练习 luogu-P1304 哥德巴赫猜想
📅 2025-02-14·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#多重循环
GESP二级联系,多层循环和分支练习,难度★★☆☆☆。
luogu-P1304 哥德巴赫猜想
题目要求
题目描述
输入一个偶数 ,验证 所有偶数是否符合哥德巴赫猜想:任一大于 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 ,,则 是错误答案。
输入格式
第一行输入一个正偶数
输出格式
输出 行。对于第 行:
首先先输出正偶数 ,然后输出等号,再输出加和为 且第一个加数最小的两个质数,以加号隔开。
输入 #1
BASH
10
输出 #1
BASH
4=2+2
6=3+3
8=3+5
10=3+7
说明/提示
数据保证,。
题目分析
解题思路
- 读取输入的正偶数N。
- 从4开始,到N结束,每次增加2,遍历所有偶数。
- 对于每个偶数i,初始化变量other为0,用于存储i减去j的结果。
- 从2开始,到i的一半结束,遍历所有可能的j。
- 计算i减去j的结果,并存储在other中。
- 检查j是否为质数,如果不是,则继续下一轮循环。
- 如果j是质数,则检查other是否为质数。
- 如果j和other都是质数,则输出结果,格式为i=j+other,并跳出循环。
- 重复步骤3-8,直到遍历完所有偶数。
示例代码
CPP
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int n; // 读取输入的正偶数N
cin >> n; // 从输入流中读取N的值
for (int i = 4; i <= n; i += 2) { // 从4开始,到N结束,每次增加2
int other = 0; // 初始化变量other,用于存储i减去j的结果
for (int j = 2; j <= i / 2; j++) { // 从2开始,到i的一半结束
bool flag = true; // 初始化标志位,用于判断j和other是否为质数
other = i - j; // 计算i减去j的结果
for (int k = 2; k <= sqrt(j); k++) { // 从2开始,到j的平方根结束
if (j % k == 0) { // 如果j能被k整除,则j不是质数
flag = false; // 将标志位设置为false
break; // 跳出循环
}
}
if (!flag) { // 如果j不是质数,则继续下一轮循环
continue;
} else { // 如果j是质数,则检查other是否为质数
for (int k = 2; k <= sqrt(other); k++) { // 从2开始,到other的平方根结束
if (other % k == 0) { // 如果other能被k整除,则other不是质数
flag = false; // 将标志位设置为false
break; // 跳出循环
}
}
}
if (flag) { // 如果j和other都是质数,则输出结果
cout << i << "=" << j << "+" << other << endl; // 输出格式为i=j+other
break; // 跳出循环
}
}
}
return 0; // 程序返回0,表示执行成功
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!