打印空心金字塔——分析及代码实现

问题

很多人在初学编程时都会遇到一个小题,就打印金字塔、打印空心金字塔等。今天我们就打印空心金字塔这个问题,来分析一下。不仅是学习解决这个问题,更重要的是学习分析问题解决问题的方法。很多同学在学习时遇到困难就想退缩,这是不对的!还有,不要连想都不想就下手写代码,不如先把整个问题分析清楚,在草纸上完成解决方案,再照着方案写代码,这样往往更快错误更少。

要打印的空心金字塔往往是这样子的形状:
    *
   * *
  *   *
 *     *
*********

分析

上面是一个五层的金字塔,大家来观察一下,第一层只有中间一个星号,最后一层全是星号。为了观察更清楚,我们通过一个表格来显示。

    0   1   2   3   4   5   6   7   8
0                   *               
1               *       *           
2           *               *       
3       *                       *   
4   *   *   *   *   *   *   *   *   *

假设金字塔的层数为 n
那么每行字符总数(包括空格和星号)为2n1

由于在大部分编程语言中,下标都是从0开始,所以上图中左侧的行号是从0到4,上边的列号是从0到9。
注:可能初学者在刚开始接触“数组下标从0开始”时经常会有这种困扰,平常的第一个到了编程里成了第0个,脑袋转不过来弯,希望初学者一定克服这一点。

i 表示第几行,取值范围为[0,n1]
(1) i==0 时 ,我们需要打印 n1 个空格,再打印一个星号,再打印 n1 个空格*。
(2) i==n1 时,我们只需要打印 2n1 个星号即可。
(3)其他情况下,每一行都可以分成五部分:<1> n1i 个空格 <2>1个星号 <3> 2i1 个空格 <4>1个星号 <5> n1i 个空格
注:上述中(叙述中斜体部分)右侧的空格可以不需要打印,不影响显示效果。
这样,这个问题就算是完整的分析完了,可以照 着上边的分析写代码了。

代码实现

$n = 10; //金字塔的层数
$num = $n * 2 - 1; //每层金字塔的字符数量
echo "金字塔的层数为:".$n."\n";

for ($i = 0; $i < $n; $i++) {
  if ($i == 0) {// 打印第0层
    for($j = 0; $j < $n-1; $j++) {
      echo " ";
    }
    echo "*";
  } else if ($i == $n - 1) {// 打印第n-1层,最后一层
    for ($j = 0; $j < $num; $j++) {
      echo "*";
    }
  } else { //其他层
    //先打印左侧空格
    for ($j = 0; $j < $n-1-$i; $j++) {
      echo " ";
    }
    //打印左侧的*
    echo "*";
    //打印中间的空格
    for ($j = 0; $j < $i * 2 - 1; $j++) {
      echo " ";
    }
    //打印右侧的*
    echo "*";
  }
  echo "\n";//如果显示在网页里,则输出<br/>
}

分别看一下打印5层和10层的金字塔的结果:
这里写图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张欣-男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值