【C语言】打印杨辉三角

题目描述

输入数字 n ,打印 n 行杨辉三角

1

1 1

1 2 1

1 3 3 1

……

小贴士:什么是杨辉三角?

定义: 

  1. 每个数等于它上方两数之和。

  2. 每行数字左右对称,由1开始逐渐变大。

  3. 第n行的数字有n项。

  4. 前n行共[(1+n)n]/2 个数。

  • 详情见上图


 解题思路

1、根据杨辉三角的性质得:因为有 n 行,且每行有 n 个元素,所以可以创建一个二维数组arr[ 30 ][ 30 ] = { 0 }  和一个 int 类型的变量 n 。

int arr[30][30] = { 0 }, n = 0;

2、因为输入数字即可打印对应行数的杨辉三角,所以这里采用 while 循环,我们先将每一行和每一行内的基本框架打印出来,这里用 rowcolumn 控制行与列。

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

我们先分析上图,设 n5 则第 n - 0(5)行的空格为 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 ] 之后的空间都被闲置了。就如同我买了一间正方形的屋子,我只能用其一半的面积。

* * * * * * * *
*           * *
*闲置     * * *
*       * * * *
*     * * * * *
*   * * * * * *
* * * * * * * *
* * * * * * * *

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值