PHP初学者求助:如何计算可用砖块能搭建的金字塔层数
金字塔层数计算问题解决方案
需求说明
给定可用砖块数量,计算能搭建的金字塔层数:第1层用1块砖,第2层用2块,……第k层用k块,总砖块数为1+2+…+k,需找到最大的k使得总砖块数不超过给定数量。例如:
- 6块砖:
1+2+3=6,可搭建3层 - 10块砖:
1+2+3+4=10,可搭建4层
原代码的问题
- 逻辑错误:原代码仅单纯递增变量
h直到等于砖块数,完全没有计算每层消耗的砖块,无法得到正确层数。 - 输入处理错误:
readline(...) . PHP_EOL会把输入的数字转为带换行符的字符串,后续计算可能出现问题,需转为整数。
解决方案
方式一:循环累加(适合初学者理解)
通过逐步累加每层所需砖块,直到剩余砖块不足以搭建下一层:
<?php // 获取输入并转为整数,兼容非数字输入 $blocks = (int)readline("Enter how many blocks are available for a pyramid?"); $layers = 0; $totalUsed = 0; // 检查是否能搭建下一层 while ($totalUsed + ($layers + 1) <= $blocks) { $layers++; $totalUsed += $layers; } echo "可搭建层数:$layers\n"; ?>
方式二:数学公式法(高效简洁)
利用金字塔总砖块数的公式推导,直接计算最大层数:
总砖块数公式为 S = k(k+1)/2 ≤ 可用砖块数,解此不等式可得最大层数:
<?php $blocks = (int)readline("Enter how many blocks are available for a pyramid?"); $layers = floor( (sqrt(8 * $blocks + 1) - 1) / 2 ); echo "可搭建层数:$layers\n"; ?>
测试验证
- 输入6:计算得
(√(8*6+1)-1)/2 = (7-1)/2=3,输出3层 - 输入10:
(√(8*10+1)-1)/2=(9-1)/2=4,输出4层
内容的提问来源于stack exchange,提问作者Nudi Wilgehof
相关产品推荐
相关产品推荐

