题目描述
输入数字 n ,打印 n 行杨辉三角
1
1 1
1 2 1
1 3 3 1
……
小贴士:什么是杨辉三角?
定义:
每个数等于它上方两数之和。
每行数字左右对称,由1开始逐渐变大。
第n行的数字有n项。
前n行共[(1+n)n]/2 个数。
详情见上图
解题思路
1、根据杨辉三角的性质得:因为有 n 行,且每行有 n 个元素,所以可以创建一个二维数组arr[ 30 ][ 30 ] = { 0 } 和一个 int 类型的变量 n 。
int arr[30][30] = { 0 }, n = 0;
2、因为输入数字即可打印对应行数的杨辉三角,所以这里采用 while 循环,我们先将每一行和每一行内的基本框架打印出来,这里用 row 与 column 控制行与列。
int arr[30][30] = { 0 }, n = 0; int row = 0, column = 0; while (scanf("%d", &n))//只要输入的数大于 0 均可进入循环 { for (row = 0; row < n; row++) //数组中第一行的下标,即 row 为 0 ,所以得从 0 开始 { for (column = 0; column <= row; column++)// 保证 行数=每行元素个数 { if (column == 0 || column == row) //将每行第一个元素与最后一个元素初始化为 1 { arr[row][column] = 1; } printf("%3d ", arr[row][column]); //打印 } printf("\n"); // 换行 } }
下面是运行结果:
3、填充中间的元素,根据定义1:“每个数等于它上方两数之和” 我们可知:坐标为
(row,column)元素的值为(row - 1,column)与(row - 1,column - 1)的和即:
arr[ row ][ column ] = arr[ row - 1 ][ column ] + arr[ row - 1 ][ column - 1 ]。我们将这行代码放在 if 语句之后即可
else { arr[row][column] = arr[row - 1][column] + arr[row - 1][column - 1]; }
下图为运行结果
4、此时我们已完成任务,但是我们目前打印出来的还只是直角三角形并不够美观,我们还需将他美化成等腰三角形。
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
我们先分析上图,设 n 为 5 则第 n - 0(5)行的空格为 0 ,n - 1(4) 行的空格为 1, n - 2 (3)行的空格为2,第 n - 3(2)行的空格为 3, 第n - 4(1)的空格为 4
由此我们可以得出结论:当我们设定 n 行时,其第一行的空格数为 n - 1 个开始每行减一个空格数知道最后一行空格为0,所以我们可以在打印每行数字之前放入一个打印空格的循环。
int b = 0; for (b = 0; b < n - 1 - row; b++) { printf(" "); }
最后我们将打印出的数向右对其,只需将 %d 改成 %nd 即可,我这里选择向右对其3位数改成 %3d 就可以了。
程序源码
#include <stdio.h> int main() { int arr[30][30] = { 0 }, n = 0, row = 0, column = 0; while (scanf("%d", &n))//只要输入的数大于 0 均可进入循环 { for (row = 0; row < n; row++)//数组中第一行的下标,即 row 为 0 ,所以得从 0 开始 { int b = 0; for (b = 0; b < n - 1 - row; b++)//打印每行前面的空格 { printf(" "); } for (column = 0; column <= row; column++) // 保证 行数=每行元素个数 { if (column == 0 || column == row)//将每行第一个元素与最后一个元素初始化为 1 { arr[row][column] = 1; } else { arr[row][column] = arr[row - 1][column] + arr[row - 1][column - 1]; //填充中间元素 } printf("%3d ", arr[row][column]); //打印杨辉三角 } printf("\n");//换行 } } return 0; }
运行结果
总结
将二维数组这个相对抽象的概念运用到实际中,有助于我们对于二维数组的理解。但该代码也比较大的缺点, 如第一行arr[ 1 ][ column ]中,真正有用的只有arr[ 1 ][ 1 ],arr[ 1 ][ 1 ] 之后的空间都被闲置了。就如同我买了一间正方形的屋子,我只能用其一半的面积。
* * * * * * * * * * * *闲置 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *