PHP生成三角形质数脚本异常,期望特定格式输出求助
解决PHP生成质数三角形排列的问题
咱们先拆解下你当前代码的问题:你嵌套的循环逻辑完全跑偏啦!内层的质数查找循环每次都会遍历1到20,把所有符合条件的质数全打印一遍,然后外层的$a和$b循环只是在重复这个打印操作——比如第一行($a=0)只重复1次,第二行($a=1)重复2次,以此类推,所以才会出现一堆重复的质数串。
要实现你想要的三角形效果,得先明确需求:你给出的期望输出是固定的序列,还是有某种规律的质数排列?我分两种情况给你解决方案:
情况1:实现你给出的固定期望输出
如果就是要得到你写的这个结果:
2
3 3
5 5 5
3 3 2
最简单的方式就是直接定义好这个二维数组,然后循环打印就行,代码如下:
<?php // 定义好你要的三角形结构 $primeTriangle = [ [2], [3, 3], [5, 5, 5], [3, 3, 2] ]; // 遍历每一行并打印 foreach ($primeTriangle as $row) { echo implode(' ', $row) . "<br />"; } ?>
情况2:生成通用的质数三角形(按规律排列)
如果你的需求是生成有规律的质数三角形(比如第n行有n个质数,或者每行重复同一个质数n次),那咱们可以先预生成足够的质数列表,再按规则组装每行内容:
子方案A:每行n个连续的质数
比如第一行1个质数,第二行2个,第三行3个,以此类推:
<?php // 先写个生成质数列表的函数 function generatePrimes($maxNum) { $primes = []; for ($i = 2; $i <= $maxNum; $i++) { $isPrime = true; // 优化质数判断:只需要检查到平方根即可 for ($j = 2; $j <= sqrt($i); $j++) { if ($i % $j == 0) { $isPrime = false; break; } } if ($isPrime) { $primes[] = $i; } } return $primes; } // 生成足够多的质数(这里生成到50,足够满足多行需求) $allPrimes = generatePrimes(50); $totalRows = 4; // 要生成的行数 for ($row = 1; $row <= $totalRows; $row++) { // 从质数列表中取前row个元素 $currentRow = array_slice($allPrimes, 0, $row); // 用空格分隔打印,再加换行 echo implode(' ', $currentRow) . "<br />"; } ?>
这段代码的输出是:
2 2 3 2 3 5 2 3 5 7
子方案B:每行重复同一个质数n次
比如第一行1个2,第二行2个3,第三行3个5,第四行4个7:
<?php function generatePrimes($maxNum) { $primes = []; for ($i = 2; $i <= $maxNum; $i++) { $isPrime = true; for ($j = 2; $j <= sqrt($i); $j++) { if ($i % $j == 0) { $isPrime = false; break; } } if ($isPrime) { $primes[] = $i; } } return $primes; } $allPrimes = generatePrimes(50); $totalRows = 4; for ($rowIndex = 0; $rowIndex < $totalRows; $rowIndex++) { // 取第rowIndex个质数,重复rowIndex+1次 $currentPrime = $allPrimes[$rowIndex]; $currentRow = array_fill(0, $rowIndex + 1, $currentPrime); echo implode(' ', $currentRow) . "<br />"; } ?>
输出结果:
2 3 3 5 5 5 7 7 7 7
核心问题总结
你原来的代码错误在于:每次内层循环都把所有质数全打印一遍,外层循环只是在重复这个打印动作,完全没有按“每行对应数量的特定质数”的逻辑来处理。只要调整循环逻辑,先准备好质数资源,再按行组装内容,就能得到你想要的三角形效果啦。
内容的提问来源于stack exchange,提问作者Imam Nur
相关产品推荐
相关产品推荐

