专栏文章

B4002 [GESP202406 二级] 平方之和

B4002题解参与者 23已保存评论 23

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
23 条
当前快照
1 份
快照标识符
@mipvwc3k
此快照首次捕获于
2025/12/03 18:48
3 个月前
此快照最后确认于
2025/12/03 18:48
3 个月前
查看原文
欢迎报名洛谷网校,期待和大家一起进步!

本题考察循环嵌套。
首先我们使用一重循环读入正整数 aa。对于每一个 aa,我们有两种方式处理:

方法 1

使用二重循环,第一重循环枚举 xx,第二重循环枚举 yy,然后判断 x×x+y×yx\times x+y\times y 是否与 aa 相等。
使用这一种做法,需要做出优化:如果 x×xx\times x 或者 y×yy\times y 的结果大于 aa,则后面的循环不必再进行了。例如说 a=102a=102,此时若 y=10y=1010×10=10010\times 10=10011×11=12111\times 11=121,再往后结果只会更大,不可能是答案。
找到解之后,使用布尔类型变量 flag 标记找到解,输出 Yes 并且退出两重循环。
参考代码:
CPP
bool flag = false; // 还未发现解
// 在循环条件中的 !flag,意思是如果 flag 为真,则不执行循环。
for (int x = 1; x * x <= a && !flag; x++) {
    for (int y = 1; y * y <= a && !flag; y++) {
        if (x * x + y * y == a) {
            flag = true; // 找到了一组解
            cout << "Yes" << endl;
        }
    }
}
// 无解情况输出 No

方法 2

实际上我们只需要循环枚举 xx 即可。我们令 b=ax2b=a-x^2。我们只需要判断 bb 是否是完全平方数即可。
判断的方式是对 bb 开根号得到的结果放入一个 int 类型变量 sqb 中,随后我们判断 sqb * sqb 是否等于 bb。例如,21.414\sqrt{2} \approx 1.414,转为 int 类型后是 11,而 1×1=121\times 1=1\neq 2,因此 2\sqrt{2} 不是一个整数,因此 22 不是一个完全平方数。
参考代码:
CPP
for (int x = 1; x * x < a; x++) {
    int b = a - x * x;
    int sqb = sqrt(b);
    if (sqb * sqb == b) {
        cout << "Yes" << endl;
        flag = true;
        break;
    }
}
// 无解情况输出 No

评论

23 条评论,欢迎与作者交流。

正在加载评论...