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;
}
文章介绍了两种方法判断一个整数是否为平方数。第一种通过连续奇数序列的和来表示,如0+1,0+1+3,0+1+3+5等;第二种利用二分法在[1,num/2]区间内寻找乘积等于给定整数的正整数。两种方法均以代码形式展示,最后返回结果,若找到则返回平方根,否则返回-1。
4407

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



