题意:输入一个数,判断该数是否是完全平方数(true是,false否),要求不能使用库函数sqrt
思路:1、任何一个数都能质因数分解,判断质因子是否成对出现;(超时)O(sqrt(n))
2、找到a^2 = n中a的值,采用binary search。O(log(n/2))
3 、递推关系式, x^2 - (x-1)^2 = 2x-1 ,... 3^2 - 2^2 = 2*3 -1, 2^2-1^2 = 2*2 -1, 所以,x^2 = 1+3+5+...+ (2x-1),即如果一个数是完全平方数,必定能写成1、3。。。的序列
public boolean isPerfectSquare(int num) {
/*resolve prime factor
* principle: every integer can be multiple of primes
* composite if %2==0 except for 2
* in case of prime self
*/
int gw = num % 10;
if(gw != 0 && gw != 1 && gw != 4 && gw != 9 && gw != 6 && gw != 5)
return false;
//binary search
int right = num / 2 + 1;
int left = 1;
int mid = (left + right) / 2;
long mul;
while(left <= right){
// System.out.println(left + " " + mid + " " + right+ " "+ mid*mid); //mid * mid beyond range of int
mul = mid * mid;
if(mul == num){
return true;
}
else if(mul > num || mul < 0){
right = mid - 1;
mid = (left + right)/2;
}else{
left = mid + 1;
mid = (left + right)/2;
}
}
return false;
}
public boolean isPerfectSquare(int num) {
//1/3/5/.../2x-1
int i = 1, tp = num;
while(tp > 0){
tp -= i;
i += 2;
}
if(tp == 0)
return true;
else
return false;
}