面试题:判断一个完全平方数
方法一:平方根法
C++
bool isPerfectSquare(int n) {
int sqrt_n = int(sqrt(1.0 * n));
return sqrt_n * sqrt_n == n;
}
方法二:连续奇数和法
c++
// 一个完全平方数可以表示为前n个连续奇数的和,如1 + 3 + 5
// 不断的减去连续的奇数,判断最后能否得到0
bool isPerfectSquare(int n) {
for (int i = 1; n > 0; i += 2) {
n -= i;
}
return n == 0;
}
方法三:二分法
c++
// 范围:[1, n / 2 + 1]
bool isPerfectSquare(int n) {
int l = 1, r = n / 2 + 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (mid * mid == n) {
return true;
} else if (mid * mid < n) {
l = mid + 1;
} else {
r = mid;
}
}
return false;
}
方法四:模运算辅助法
有这样一条规律:完全平方数在模n下有特定的余数
比如:
-
一个数如果是完全平方数,那么它除以 4 的余数只能是 0 或 1。换句话说,完全平方数在模 4 意义下等于 0 或 1。
-
一个数如果是完全平方数,它除以 16 的余数必须是 0, 1, 4, 或 9。
这些方法不能让我们判断是否是完全平方数,但是可以辅助我们判断或者找到不是完全平方数的数字。
最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB