is_prime函数判断质数:小于2返回false,2返回true,偶数(除2外)返回false,奇数只需试除到sqrt(n)的奇数因子。

怎么用 is_prime 判断一个数是不是质数
直接写个函数就行,但别一上来就试到 n-1——那太慢。质数判断的核心是:只需试除到 sqrt(n),且跳过所有偶数(除了 2)。注意边界:小于 2 的数不是质数,2 是质数,负数和 0、1 都得提前返回 false。
n → 直接返回 <code>false-
n == 2→ 返回true -
n % 2 == 0→ 返回false(排除其他偶数) - 从
3开始,只试奇数因子,上限取static_cast<int>(std::sqrt(n)) + 1</int>(+1防止浮点截断漏判)
C++ 里 sqrt 和整数开方容易出什么错
std::sqrt 返回 double,对大整数(比如接近 INT_MAX)可能精度丢失,导致循环少跑一次。更稳的方式是用 i * i 替代 <code>i ,完全避开浮点运算。
- 用
i * i 代替 <code>i (std::sqrt(n)),安全、快、无依赖 - 但要注意
i * i可能溢出——所以i类型至少和n一样宽,或加条件i (更稳妥) - 别在循环里反复调用
std::sqrt(n),它不内联,还带浮点开销
多次调用时要不要预处理素数表
单次判断用试除法足够;但如果要查成百上千个数(比如筛区间内所有质数),硬算每个都 sqrt(n) 就亏了。这时该换思路:用埃氏筛或线性筛预生成布尔数组。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 查
[2, N]内所有质数 → 用std::vector<bool> is_prime(N+1, true)</bool>做埃氏筛,时间复杂度O(N log log N) - 单个数 >
N?仍得回退到试除法,但可只试「已知质数」(需先筛出 ≤sqrt(n)的质数) - 别为了查 5 个数就上筛法——初始化开销可能比直接算还大
为什么 int 版本的 is_prime 在 64 位环境也得小心
很多人以为 int 足够,但 C++ 标准只保证 int 至少 16 位。实际中常见 int 是 32 位,最大约 21 亿——而 2147483647 本身是质数,它的平方远超 long long?不,但 i * i 在 int 下会溢出,结果未定义。
- 输入用
long long或unsigned long long更通用 - 循环变量
i类型必须不小于输入类型,或改用i 避免乘法 - 编译器不会帮你检查
i * i溢出,运行时行为不可靠
真正麻烦的不是算法本身,是边界值和类型隐式转换——比如把 unsigned int 传给期望 int 的函数,或者忘了 sqrt 对负数返回 NaN。这些地方一错,结果就静默错掉。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










