题目:给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。
示例1:
输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
示例2:
输入: 3
输出: False
题解:使用双指针i,j指针所指的数一定是在0~c之间,i指针从小值开始,j指针从大值开始,但是这里是两数的平方和,所以必须要考虑内存溢出问题,我们需要确定j的最大值,当i指针指向0时,j指向最大值,此值为c的平方根,据此确定了j指针指向的最大值,这样才不会造成内存溢出。
/**
*
*/
package com.ljq.doublepoint;
import java.util.Scanner;
/**
* @author 作者 Your-Name: 李佳琪
* @version 创建时间:2019年8月25日 下午8:15:29
* 类说明
*/
public class SquareSum {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int c = scanner.nextInt();
boolean ret = judgeSquareSum(c);
System.out.println(ret);
}
scanner.close();
}
public static boolean judgeSquareSum(int c) {
boolean ret = false;
//c的平方根为j的最大值,否则j有可能造成内存溢出
int i=0,j=(int)Math.sqrt(c);
int sum = 0;
while(i<=j) {
sum = (int)(Math.pow(i, 2)+Math.pow(j, 2));
if(sum == c) {
ret = true;
break;
}else if(sum > c) {
j--;
}else {
i++;
}
}
return ret;
}
}