1. 完全平方数
给定一个 正整数 num (1 <= num <= 2^31 - 1),编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
1.1 解法一
使用库函数,求得 sqrt(num)
,然后遍历 1 到 sqrt(num)
数字,分别相乘与 num
比较
class Solution {
public:
bool isPerfectSquare(int num)
{
for(int i=1;i<=sqrt(num);i++)
{
if (i*i == num)
{
return true;
}
}
return false;
}
};
1.2 解法二
不使用库函数,遍历 1-n 每个数字相乘结果,如果结果与 num
相等则返回 true
,如果大于 num
,则返回 false
,注意要是用 long long
型数据,避免溢出。
class Solution {
public:
bool isPerfectSquare(int num) {
for(long long i=1;i<=num;i++)
{
if (i*i == num)
{
return true;
}
if (i*i >num)
{
return false;
}
}
return false;
}
};
1.3 解法三
使用二分法来解决。
class Solution {
public:
bool isPerfectSquare(int num) {
int left = 1;
int ritht = num;
for(int i=1;left<=ritht;i++)
{
int mid = left + (ritht - left)/2;
// int product = mid * mid 溢出
int temp = num / mid;
if (mid < temp)
{
left = mid + 1;
}
else if (mid > temp)
{
ritht = mid - 1;
}
else if (mid == temp)
{
if (num % mid == 0) // 因为上面是 整除,所以此处要加模判断
{
return true;
}
else
{
return false;
}
}
}
return false;
}
};
2. 求平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
2.1 遍历相乘
class Solution {
public:
int mySqrt(int x) {
for (int i=1; i<=x; i++)
{
if (i == x/i) // 防止溢出,不使用 i*i == x 的写法
{
return i;
}
else if (i > x/i)
{
return i-1;
}
}
return 0;
}
};
2.2 二分法
class Solution {
public:
int mySqrt(int x) {
int low = 0;
int high = x;
for(int i=1;low<high;i++)
{
int mid = low + (high - low) / 2 + 1;
if (mid > x / mid)
{
high = mid - 1;
}
else
{
low = mid;
}
}
return low;
}
};