题目描述
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。
输入
测试数据由多组测试样例组成。每组测试样例第一行输入一个正整数 c ( 1 <= c <= 2147483647 )
数据约束:
对于c < 100000,每个测试文件不超过1000组。
对于100000 <= c <= 2147483647 ,每个测试文件不超过100组。
输出
如果存在整数a和b,则输出True。否则输出False
样例输入 Copy
5
3
样例输出 Copy
True
False
双指针
- 建立两个指针L,R;
- L是0开始左边的平方,R是右边sqrt(n)开始的平方
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
while(~scanf("%lld",&n)){
if(n==0){//这里进行一个特判
cout<<"False"<<endl;
continue;
}
long long l,r,flag=0;//这里l和r要开longlong l^2+r^2会超出int
l=0;
r=floor(sqrt(n))+1;
do {
if(((l*l+r*r)==n)){
flag=1;
break;//找到就直接退出
}
else if((l*l+r*r)<n) l++;//小于n左边加一;
else if((l*l+r*r)>n) r--;大于h右边减一;
}while(l<=r);
if(flag==0) cout<<"False"<<endl;
else cout<<"True"<<endl;
}
return 0;
}