You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP新手求助:如何找出所有差值为2的素数对

如何筛选出所有满足|p₁ - p₂|=2的素数对(孪生素数)

先看你原代码存在的几个问题:

  1. 素数判断函数有bug:
    • 循环条件$teiler*$teiler < $nummer错误,比如4的平方根是2,这个条件会让循环不执行,误把4判断为素数,应该改成$teiler*$teiler <= $nummer
    • 没处理$nummer <=1的情况,1不是素数,但原函数会返回TRUE
  2. 素数对筛选逻辑不对:你现在只是把相邻素数配对后计算差值,没有筛选出差值等于2的对,最后输出的是差值数组,不是目标素数对本身

下面是修正并优化后的完整代码:

echo '<pre>';

// 修正后的素数判断函数,处理边界情况并优化效率
function istPrimzahl($nummer) {
    // 小于等于1的数不是素数
    if ($nummer <= 1) {
        return false;
    }
    // 2是唯一的偶素数
    if ($nummer == 2) {
        return true;
    }
    // 偶数直接排除(除了2)
    if ($nummer % 2 == 0) {
        return false;
    }
    // 只检查奇数因子,且范围到平方根即可
    for ($teiler = 3; $teiler * $teiler <= $nummer; $teiler += 2) {
        if ($nummer % $teiler == 0) {
            return false;
        }
    }
    return true;
}

$anfang = 1;
$ende = 2000;
$primzahlen = [];

// 收集指定范围内的所有素数
for ($zahl = $anfang; $zahl <= $ende; $zahl++) {
    if (istPrimzahl($zahl)) {
        $primzahlen[] = $zahl;
    }
}

$孪生素数对 = [];

// 遍历素数数组,筛选差值为2的相邻素数对
for ($i = 0; $i < count($primzahlen) - 1; $i++) {
    $当前素数 = $primzahlen[$i];
    $下一个素数 = $primzahlen[$i + 1];
    // 因为素数是递增排列的,直接用后减前判断即可,不用abs
    if ($下一个素数 - $当前素数 == 2) {
        $孪生素数对[] = [$当前素数, $下一个素数];
    }
}

// 输出结果
print_r($孪生素数对);
echo '</pre>';

关键优化点说明:

  • 素数判断函数里直接排除偶数(除了2),循环只检查奇数因子,比原代码效率更高
  • 筛选素数对时,因为素数数组是从小到大排序的,所以直接比较相邻两个素数的差值是否为2即可,不用计算绝对值
  • 修复了原函数对1、4这类数的错误判断

内容的提问来源于stack exchange,提问作者EatMyShorts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:03:41