面试题:判断一个完全平方数

面试题:判断一个完全平方数

方法一:平方根法

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

相关推荐
tankeven8 分钟前
HJ172 小红的矩阵染色
c++·算法
每日任务(希望进OD版)16 分钟前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
sbjdhjd20 分钟前
Docker | 核心概念科普 + 保姆级部署
linux·运维·服务器·docker·云原生·面试·eureka
charlie11451419120 分钟前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
liu****23 分钟前
第十五届蓝桥杯大赛软件赛国赛C/C++大学B组
c++·算法·蓝桥杯·acm
zhooyu24 分钟前
利用叉乘判断OpenGL中的左右关系
c++·3d·opengl
光电笑映41 分钟前
C++11 新特性全解:语法糖、容器进化与可调用对象包装
开发语言·c++
SWAGGY..1 小时前
【C++初阶】:(7)STL简介
开发语言·c++
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 279. 完全平方数 | C++ 动态规划 (完全背包)
c++·leetcode·动态规划
H Journey1 小时前
C++ 11 新特性 统一初始化与与 std::initializer_list
c++·列表初始化