题目描述
小杨有 nnn 个正整数 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an,他想知道对于所有的 i(1≤i≤n)i (1\le i\le n)i(1≤i≤n),是否存在两个正整数 xxx 和 yyy 满足 x×x+y×y=aix\times x+y \times y=a_ix×x+y×y=ai。
输入格式
第一行包含一个正整数 nnn,代表正整数数量。
之后 nnn 行,每行包含一个正整数,代表 aia_iai。
输出格式
对于每个正整数 aia_iai,如果存在两个正整数 xxx 和 yyy 满足 x×x+y×y=aix\times x+y \times y=a_ix×x+y×y=ai,输出 Yes,否则输出 No。
输入输出样例 #1
输入 #1
2
5
4
输出 #1
Yes
No
说明/提示
对于第一个正整数,存在 1×1+2×2=51\times 1+2 \times 2=51×1+2×2=5,因此答案为 Yes。
对于全部数据,保证有 1≤n≤10,1≤ai≤1061 \le n \le 10,1 \le a_i \le 10^61≤n≤10,1≤ai≤106。
解题思路
- 读取输入的正整数数量 𝑛。
- 遍历每个正整数 𝑎𝑖。
- 对于每个 𝑎𝑖,初始化一个标志变量,用于标志是否找到满足条件的 𝑥 和
𝑦。 - 遍历可能的 𝑥 值 对于每个可能的 𝑥 值,计算可能的 𝑦 值
- 如果 𝑦 是整数(即强转后,不丢失小数位,所以可以验证原等式)且大于0,则标志变量为真,退出循环。
- 根据标志变量的值,输出 Yes 或 No。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
int a;
bool found=false;
while(n--){
cin>>a;
int x,y;
found=false;//注意一定要记得重置
for(x=1;x*x<=a;x++){ //注意x,y是正整数,不包含0
y=sqrt(a-x*x);
if(x*x+y*y==a&&y>=1) {//注意此处不能漏掉y>=1的条件
found=true;
break ;//注意循环内这两条语句先后顺序
}
}
if(found )cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}在这里插入代码片
946

被折叠的 条评论
为什么被折叠?



