您的位置:首页 >C++高效判断素数算法实现方法
发布于2026-03-02 阅读(0)
扫一扫,手机访问
sqrt(n) 是判断上限的关键,因为若n有大于sqrt(n)的因子d,则必存在对应小于sqrt(n)的因子n/d,故只需试除到sqrt(n)即可严格判定素数。

sqrt(n) 是判断上限的关键素数定义是大于1且只能被1和自身整除的正整数。暴力试除时,若 n 有大于 sqrt(n) 的因子 d,那必然存在对应的小于 sqrt(n) 的因子 n/d。所以只需检查到 sqrt(n) 即可——不是“大概可以”,而是数学上严格等价。
常见错误是写成 i <= sqrt(n) 放在循环条件里:每次迭代都调用 sqrt(浮点运算+类型转换),还可能因精度问题漏判或越界。正确做法是提前算一次整数上界:int limit = static_cast,或更稳妥地用 i * i <= n 避开浮点。
i * i <= n 更快、无精度风险,但注意 i 别溢出(n 接近 INT_MAX 时,i 较大时 i*i 可能溢出;此时改用 long long i 或切回 sqrt)n == 2 要单独返回 true,否则 i=2 时 i*i <= n 不成立,直接跳过循环误判为合数n == 2,其余偶数直接返回 false,省一半时间is_prime 函数怎么处理边界和小数字实际代码里最容易翻车的是 n <= 1、n == 2、n == 3 这几个点。C++ 没有内置素数判断,必须手动覆盖:
n < 2 → 直接 false(0、1、负数都不是素数)n == 2 → true(唯一偶素数)n % 2 == 0 → false(排除其余所有偶数)n == 3 → 会被后续奇数循环捕获,但提前写 if (n == 3) return true; 并不必要,反而冗余示例精简写法:
bool is_prime(int n) {
if (n < 2) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return false;
}
return true;
}sieve_of_eratosthenes如果要判断 [2, N] 区间内所有数是否为素数(比如 N=1e6),单个 is_prime 调用 N 次是 O(N√N),而埃氏筛是 O(N log log N),快一个数量级以上。
核心逻辑是:从 2 开始,把每个素数的倍数全标为合数。关键细节:
N+1,索引即数值(is_prime[i] 表示 i 是否为素数)sqrt(N),因为大于 √N 的素数,其最小未标记倍数必 > Ni * i 开始,不是 2*i——因为更小的倍数(如 2*i, 3*i…)已被更小的素因子筛过了vector 节省内存,但注意它特化实现可能慢;高频访问场景可用 vector所有大于3的素数都形如 6k ± 1(因为其他形式:6k, 6k+2, 6k+3, 6k+4 都能被2或3整除)。利用这点可跳过更多合数,但实际收益有限:
n 极大(如 > 1e12)且调用频繁时才值得考虑,此时还要配合 Miller-Rabini += 2 就够了,清晰、稳定、易调试真正容易被忽略的是:int 溢出和 unsigned 类型混用。比如用 unsigned int 存 n,再写 i * i <= n,当 i 接近 65536 时 i*i 会回绕,导致无限循环。统一用 long long i 或加溢出检查更稳妥。
上一篇:《七日世界》5阶武器全解析
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9