二级
C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++二级真题 luogu-b4002, [GESP202406 二级] 平方之和
📅 2025-02-11·✍️ OneCoder·计算中...·⏱️ 4 分钟
#GESP#C++#多重循环
GESP二级真题,多层循环和分支练习,难度★✮☆☆☆。
luogu-B4002 [GESP202406 二级] 平方之和
题目要求
题目描述
小杨有 个正整数 ,他想知道对于所有的 ,是否存在两个正整数 和 满足 。
输入格式
第一行包含一个正整数 ,代表正整数数量。 之后 行,每行包含一个正整数,代表 。
输出格式
对于每个正整数 ,如果存在两个正整数 和 满足 ,输出
Yes,否则输出No。
输入 #1
BASH
2
5
4
输出 #1
BASH
Yes
No
说明/提示
对于第一个正整数,存在 ,因此答案为 Yes。
对于全部数据,保证有 。
题目分析
解题思路
- 读取输入的正整数数量 。
- 遍历每个正整数 。
- 对于每个 ,初始化一个标志变量,用于标志是否找到满足条件的 和 。
- 遍历可能的 值,从 到 。
- 对于每个可能的 值,计算可能的 值:。
- 如果 是整数(即强转后,不丢失小数位,所以可以验证原等式)且不为 ,则标志变量为真,退出循环。
- 根据标志变量的值,输出
Yes或No。
示例代码
CPP
#include <cmath>
#include <iostream>
using namespace std;
int main() {
int n; // 输入的正整数数量
cin >> n; // 读取输入的正整数数量
int a1; // 每个正整数
for (int i = 1; i <= n; i++) { // 遍历每个正整数
cin >> a1; // 读取每个正整数
bool flag = false; // 标志是否找到满足条件的x和y
for (int k = 1; k * k < a1; k++) { // 遍历可能的x值
double r = sqrt(a1 - k * k); // 计算可能的y值
int d = (int)r; // 将y值转换为整数
if (d * d + k * k == a1 && d != 0) { // 判断是否满足条件
flag = true; // 如果满足条件,则标志为true
break; // 并退出循环
}
}
if (flag) { // 如果找到满足条件的x和y
cout << "Yes" << endl; // 输出Yes
} else { // 如果没有找到满足条件的x和y
cout << "No" << endl; // 输出No
}
}
return 0;
}
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!