1.一个整数是平方数,当且仅当它可以被一个连续的奇数序列的和表示,例如0、1、4、9可以表示为0+1、0+1+3、0+1+3+5,从另一个角度,也可以去看两个相邻平方数之差,x的平方-(x-1)的平方=2*x-1,所以可以让一个整数不断去减两个相邻平方数之差,当最后的差值为0,则说明原始整数为平方数,否则相反,代码如下所示。
int findRoot(int n) {
int i = 0;
while(n > 0) {
i++;
n = n - (2 * i - 1);
}
if(n == 0) {
return i;
}
return -1;
}
2.使用二分法判断一个整数是否为平方数,在[1, num/2]中使用二分法寻找是否有正整数的乘积为当前整数
int findRoot(int n) {
if(n = 0) return 0;
if(n = 1) return 1;
if(n = 4) return 2;
int left = 1;
int right = n / 2;
unsigned mid = 0;
unsigned ji = 0;
while(left <= right) {
mid = left + (right - left) / 2;
ji = mid * mid;
if(ji == n) {
return mid;
}
else if(ji > n) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return -1;
}