B4247 [语言月赛 202503] 半个哥德巴赫猜想 题解
[语言月赛 202503] 半个哥德巴赫猜想 题解
Source & Knowledge
本题来源于 2025 年 3 月的语言月赛,涉及复杂循环嵌套等知识。
文字题解
题目要求将
定义回顾 我们首先回顾缪零数与质数的定义:
- 缪零数:
n 是某个m^2 的倍数(m \geq 2 ),这隐含了n \geq 4 。 - 质数:
n 不能被2\sim n-1 中任意一个整数整除,且n \neq 1 。
我们不妨首先考虑如何判断缪零数和质数。
缪零数 对于一个整数
int flag = 0; // 记录 i 是否是缪零数,1 代表是,0 代表不是
for (int k = 2; k <= i - 1; k++) {
if (i % (k * k) == 0) { // i 除以 k * k 的余数是 0,代表了 i 是 k * k 的倍数
flag = 1;
break;
}
}
质数 同理,对于一个整数
int flag = 1; // 记录 i 是否是质数,1 代表是,0 代表不是
for (int k = 2; k <= i - 1; k++) {
if (i % k == 0) {
flag = 0;
break;
}
}
有了上面两部分代码,我们只需要在最外层套一个 for 循环枚举把
for (int i = 4; i <= n - 2; ++i) {
int j = n - i;
// 分别判断 i, j 是否是缪零数、质数
// 此处直接使用上面提到的代码部分即可,故省略
...
}
在找到每一种合法的分拆方案后,我们可以使用两个变量
int c = 0;
int d = 10000; // 由于 i - j 一定不会超过 n,n 一定不会超过 10000,因此这里 d = 10000 即可
for (int i = 4; i <= n - 2; ++i) {
int j = n - i;
// 分别判断 i, j 是否是缪零数、质数
if (i, j 不满足条件) continue;
c++;
if (i < j) d = min(d, j - i);
else d = min(d, i - j);
}
cout << c << endl << d << endl;