质数区间筛选程序使用埃拉托斯特尼筛法,时间复杂度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 语法(如联合类型、严格类型提示),无警告、无依赖:
function sievePrimes(int $start, int $end): array
{
if ($end $isPrime = array_fill(0, $end + 1, true);
$isPrime[0] = $isPrime[1] = false;
for ($i = 2; $i * $i <p>}</p><p>// 示例调用
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 )
</p>进阶优化建议
对大范围(如百万级)可进一步提升实用性:
- 内存优化:用
array_values()压缩结果,或改用生成器(yield)流式输出,避免一次性加载超大数组 - 类型安全:函数签名加
#[\ReturnTypeWillChange](如需兼容旧扩展)或启用严格模式(declare(strict_types=1);) - 错误防护:用
filter_var($input, FILTER_VALIDATE_INT)预校验输入,防止非整数值传入 - 复用性:封装为静态方法或独立类,配合缓存(如
apcu_store)避免重复计算相同区间
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











