一、金字塔打印算法原理与实现
粗一看无从下手,好像很有规律,但又无法简单地总结出打印规律。
把“*”号用数字表示,规律开始变得明显,我们采用补全法,把这个三角形补成一个矩形让规律更明显。
假设打印的行数为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函数中,但是会增加重复代码,程序的嵌套层数也会增加,不符合增量式开发的原则。
最后,我们的打印结果为: