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

问题

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

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

分析

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

    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层的金字塔的结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sdlypyzq/article/details/51819722