Description
Note
Example 1
Example 2
Solution 1(C++)
class Solution {
public:
bool isPerfectSquare(int num) {
long sum=0, i=1;
while(sum < num){
sum+= i;
i+= 2;
}
return sum==num;
}
};
Solution 2(C++)
class Solution {
public:
bool isPerfectSquare(int num) {
int i=1;
while(num > 0){
num-= i;
i+= 2;
}
return num==0;
}
};
Solution 3(C++)
class Solution {
public:
bool isPerfectSquare(int num) {
long x=num; //这里如果x类型为int,就会报错
while(x*x > num){
x= (x + num/x) /2;
}
return x*x == num;
}
};
Solution 4(C++)
class Solution {
public:
bool isPerfectSquare(int num) {
if(num <= 0) return false;
int left = 1, right = num;
while(left <= right){
int mid = left + (right - left)/2;
//用除法可以避免溢出
if(mid > num / mid){
right = mid - 1;
}else if(mid < num / mid){
left = mid + 1;
}else{
return num % mid == 0;
}
}
return false;
}
};
算法分析
解法一&解法二: 这两种解法均是利用奇数数列的总和为n的平方来计算的,需要注意的是解法一中sum的类型要定义为long。因为num是int,当sum有可能大于num的时候,自然sum的类型设定为long更好。
解法三: 解法三是利用牛顿迭代法来计算的,关键地方根据平方函数做了简化,具体的解释可参考:平方根。牛顿迭代法也是计算机计算平方根的方法,同样需要注意数的范围。
解法三: 二分查找的方法。需要注意的地方就是该程序中没有使用long类型,因为使用了除法来防止溢出,非常的聪明。这一点可以留意一下。
程序分析
这道题也是考察基本的数学功底。但是对于实际程序编写来说,还是要好好注意数值的范围的。用一个类型的数就应该考虑是否会发生溢出。