题解
2026-02-05 22:58:26
发布于:浙江
24阅读
0回复
0点赞
题目解析
- 输入输出:第一行输入整数 ,接下来 行每行一个正整数 ;对每个 判断是否能表示为两个正整数的平方和,能则输出
Yes,否则输出No。 - 数据范围:根据 GESP 二级难度,通常 , 左右(具体未明示,但双重循环可过)。
- 复杂度要求:当前解法时间复杂度 ,空间复杂度 。
- 算法知识点:
暴力枚举、完全平方数、数学
思路解析
- 数学建模:对于每个查询值 ,需判定是否存在正整数对 满足 。注意 (区别于非负整数)。
- 枚举范围确定:由于 且 ,可知 。
- 双重循环验证:外层枚举 ,内层枚举 ,计算平方和。一旦发现 立即返回
true;若全部枚举完毕未找到,返回false。 - 关键细节:循环条件使用
pow(i, 2) <= x控制上限,也可写作i * i <= x(后者避免浮点精度风险)。
完整代码
#include <bits/stdc++.h>
using namespace std;
// 判定x是否能分解为两个正整数的平方和
bool check(int x) {
// 枚举第一个数i,上界为sqrt(x)
for (int i = 1; pow(i, 2) <= x; i++) {
// 枚举第二个数j
for (int j = 1; pow(j, 2) <= x; j++) {
// 检查是否满足i² + j² = x
if (i * i + j * j == x) {
return true; // 找到可行解立即返回
}
}
}
return false; // 枚举完毕无解
}
int main() {
int t;
cin >> t;
while (t--) {
int x;
cin >> x;
if (check(x)) {
cout << "Yes" << endl;
}
else {
cout << "No" << endl;
}
}
return 0;
}
这里空空如也

有帮助,赞一个