1 条题解

  • 0
    @ 2025-8-24 21:16:29

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:16:28,当前版本为作者最后更新于2025-03-18 11:56:22,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    本题考察循环嵌套。

    首先我们使用一重循环读入正整数 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 并且退出两重循环。

    参考代码:

    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 不是一个完全平方数。

    参考代码:

    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
    
    • 1

    信息

    ID
    10490
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者