
本文提供一个简洁、正确且高效的php解决方案,用于找出前5000个末位为9的质数,修正了原始代码中函数嵌套、逻辑混乱、数组误用等关键错误,并优化了质数判断与末位筛选逻辑。
本文提供一个简洁、正确且高效的php解决方案,用于找出前5000个末位为9的质数,修正了原始代码中函数嵌套、逻辑混乱、数组误用等关键错误,并优化了质数判断与末位筛选逻辑。
要生成以数字 9 结尾的前 5000 个质数(即形如 ...9 的质数,例如 19、29、59、79 等),核心在于两点:准确判断质数 + 高效筛选末位为9的数。原始代码存在多个根本性问题:在 while 循环内重复定义函数、错误使用 end() 和 $array[$j] 导致索引越界、混淆返回值与数组追加逻辑、未正确终止质数判定循环等。
以下是经过验证的优化实现:
function check_prime($num)
{
if ($num < 2) return false;
if ($num == 2) return true;
if ($num % 2 == 0) return false; // 排除偶数(除2外)
// 只需检查到 sqrt($num),且跳过偶数,提升性能
for ($i = 3; $i * $i <= $num; $i += 2) {
if ($num % $i == 0) {
return false;
}
}
return true;
}
$div9 = [];
$i = 9; // 直接从最小的以9结尾的候选数开始(注意:9本身不是质数,但可作为起点)
while (count($div9) < 5000) {
// 快速末位判断:$i % 10 === 9 比字符串拆分高效得多
if ($i % 10 === 9 && check_prime($i)) {
$div9[] = $i;
}
$i += 10; // 每次+10保证下一位仍以9结尾(9→19→29→39…),跳过大量无效数
}✅ 关键优化说明:
-
避免函数内嵌:
check_prime()定义在循环外,符合PHP作用域规范; -
末位高效判断:
$i % 10 === 9替代字符串转换与end(),既安全又快速; -
质数判定增强:排除
、<code>==2、偶数后,仅用奇数因子试除至√n,大幅提升效率; -
智能步进:
$i += 10保证所有候选数均以9结尾,将搜索空间压缩至原来的 1/10; -
边界严谨:
count($div9) 防止多取一值(原代码 <code> 会导致结果含5001项)。
⚠️ 注意事项:
- 第一个满足条件的数是
19(而非9),程序会自动跳过合数; - 最终
$div9是包含5000个整数的数组,可直接print_r($div9)或导出使用; - 若需更高性能(如生成更大规模数据),建议改用埃氏筛法预筛区间,但本题场景下试除法已足够稳定。
该方案逻辑清晰、无冗余操作,兼顾正确性与可读性,是解决“末位为9的质数序列”问题的标准实践。

















