金字塔/菱形打印方法

时间:2024-01-22 08:37:10

一、金字塔打印算法原理与实现

粗一看无从下手,好像很有规律,但又无法简单地总结出打印规律。

把“*”号用数字表示,规律开始变得明显,我们采用补全法,把这个三角形补成一个矩形让规律更明显。

假设打印的行数为6,*号以外地方(上图绿色区域)用空格表示。

第一行:(6-1)*2 个空格 ========= 1个星号

第二行:(6-2)*2个空格==========3个星号

第三行:(6-3)*2个空格==========5个星号

第四行:(6-4)*2个空格==========7个星号

第五行:(6-5)*2个空格==========9个星号

第六行:(6-6)*2个空格(即没有空格)==========11个星号

我们可以得到以下规律:

第N行:(ROWS-N)*2个空格 =====(2N-1)个*

二、金字塔打印算法源码

 1 #include <stdio.h>
 2 
 3 int main(int argc, char *argv[])
 4 {
 5     int rows;
 6 
 7     printf("Please  input rows:\n");
 8     scanf("%d",&rows);
 9 
10     for(int i=1;i<=rows;++i)
11     {
12         int star = 2*i -1 ;     //星号个数
13         int space = rows - i;   //空格个数
14 
15         //左边空格
16         for(int j=0;j<space;++j)
17             printf(" ");
18 
19         //中间 *
20         for(int j=0;j<star;++j)
21             printf("*");
22 
23         //右边空格
24         for(int j=0;j<space;++j)
25             printf(" ");
26 
27         //换
28         printf("\n");
29     }
30 
31     return 0;
32 }

三、金字塔打印算法总结

 核心算法

1         //rows表示总行数  i表示当前是第几行
2         //空格个数
3         int space = rows - i;
4         //*个数
5         int star = 2*i -1 ;

四、菱形打印

菱形打印其实金字塔打印的进阶版,等于 正向金字塔 + 反向金字塔。(一站式C语言编程 6.5小节 习题二答案)

 1 #include <stdio.h>
 2 
 3 int diamond(int, char);
 4 int draw(int, int, char);
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     diamond(3, '*');
 9     diamond(4, '*');
10     diamond(5, '+');
11     return 0;
12 }
13 
14 int diamond(int lines, char mask)
15 {
16     int rows;
17     if (lines % 2 == 0)
18     {
19         printf("输入值%d为偶数,打印错误\n", lines);
20         return 0;
21     }
22     else
23         rows = (lines + 1) / 2;
24 
25     // 分两部分打印,上半部分为rows行,下半部分为(rows - 1)行;
26     for (int i = 1; i <= rows; ++i)
27         draw(i, rows, mask);
28 
29     //下半部分反向打印,所以是逆序循环
30     for (int i = rows - 1; i >= 0; i--)
31         draw(i, rows, mask);
32 }
33 
34 int draw(int i, int rows, char mask)
35 {
36     int star = 2 * i - 1; //star个数
37     int space = rows - i; //space个数
38 
39     for (int j = 0; j < space; ++j) //左边空格
40         printf(" ");
41 
42     for (int j = 0; j < star; ++j) //中间 *
43         printf("%c", mask);
44 
45     for (int j = 0; j < space; ++j) //右边空格
46         printf(" ");
47 
48     printf("\n"); //分行
49 }

可以把draw(int,int,char)放进diamond函数中,但是会增加重复代码,程序的嵌套层数也会增加,不符合增量式开发的原则。

最后,我们的打印结果为: