质数区间筛选程序使用埃拉托斯特尼筛法,时间复杂度O(n log log n);输入闭区间[start,end],自动修正边界(start

用 PHP 8.1 写一个高效、清晰的质数区间筛选程序,核心是实现埃拉托斯特尼筛法(Sieve of Eratosthenes),而不是逐个判断每个数是否为质数。它时间复杂度低、逻辑直观,特别适合筛选连续区间内的全部质数。
明确输入与输出范围
程序应支持任意闭区间 [start, end](含端点),且自动处理边界异常:
- 若 start
- 若 end
- 支持整数参数,不接受浮点或字符串(可加类型声明强化)
- 推荐用
int类型声明和严格比较,避免隐式转换干扰
PHP 8.1 筛法实现要点
标准筛法在 PHP 中需注意内存与效率平衡。以下为关键实践:
- 创建布尔数组
$isPrime,索引代表数字,初始全设为true;$isPrime[0] = $isPrime[1] = false - 外层循环从 2 到
sqrt(end)(含),只遍历到平方根即可,大幅提升性能 - 内层标记倍数时,从
$i * $i开始(因更小的倍数已被更小的素数筛过),步长为$i - 使用
array_keys(array_filter(...))或直接遍历收集结果,保持键值对应便于调试
完整可运行示例(PHP 8.1+)
以下代码已适配 PHP 8.1 语法(如联合类型、严格类型提示),无警告、无依赖:
立即学习“PHP免费学习笔记(深入)”;
function sievePrimes(int $start, int $end): array
{
if ($end < 2) return [];
$start = max(2, $start);
<pre class="brush:php;toolbar:false;">$isPrime = array_fill(0, $end + 1, true);
$isPrime[0] = $isPrime[1] = false;
for ($i = 2; $i * $i <= $end; $i++) {
if ($isPrime[$i]) {
for ($j = $i * $i; $j <= $end; $j += $i) {
$isPrime[$j] = false;
}
}
}
// 提取 [start, end] 范围内的质数
$primes = [];
for ($n = $start; $n <= $end; $n++) {
if ($isPrime[$n]) {
$primes[] = $n;
}
}
return $primes;}
// 示例调用 print_r(sievePrimes(10, 50)); // 输出:Array ( [0] => 11 [1] => 13 [2] => 17 [3] => 19 [4] => 23 [5] => 29 [6] => 31 [7] => 37 [8] => 41 [9] => 43 [10] => 47 )
进阶优化建议
对大范围(如百万级)可进一步提升实用性:
- 内存优化:用
array_values()压缩结果,或改用生成器(yield)流式输出,避免一次性加载超大数组 - 类型安全:函数签名加
#[\ReturnTypeWillChange](如需兼容旧扩展)或启用严格模式(declare(strict_types=1);) - 错误防护:用
filter_var($input, FILTER_VALIDATE_INT)预校验输入,防止非整数值传入 - 复用性:封装为静态方法或独立类,配合缓存(如
apcu_store)避免重复计算相同区间



















