题目描述
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例
输入:16
输出:True
输入:14
输出:False
首先,想到的是sqrt,但是本题禁止使用sqrt。
其次,想到完全平方数另一个性质,即完全平方数的充分必要条件是包含奇数个因子(包括1和本身),
所以可以使用一个for循环来计算因子数量,判断是否为奇数,但不幸的是,超时,代码如下:
class Solution {
public:
bool isPerfectSquare(int num) {
int count=0;
for(int i=1;i<=num;i++)
{
if(num%i==0)
count++;
}
if(count%2==1)
return true;
return false;
}
};
痛定思痛,这么好的方法居然超时,只好另辟蹊径,于是乎想到了任何两个完全平方数之间都不可能拥有完全平方数,哎?这机会不就来了嘛!!!
于是一番操作下,代码如下:
class Solution {
public:
bool isPerfectSquare(int num) {
if(num==0)
return true;
if(num==1)
return true;
long long a,b,i=1;
while(i++)
{
a=i*i;
b=(i+1)*(i+1);
if(num>a&&num<b)
return false;
if(a==num||b==num)
return true;
}
return false;
}
};
作为第一道在leetcode刷的两个100%,我表示很开心。
需要注意的是:
1.当没有加最后一行return false
时,报出如下错误:fatal error: control may reach end of non-void function [-Wreturn-type]
这是因为当if不执行的时候,可能会没有返回值。