【C】打印杨辉三角

1、问题描述

打印如下图所示的杨辉三角

           1

         1     1

      1     2      1

    1    3     3     1

  1    4     6     4    1

1   5    10    10     5     1

2、算法分析

         观察上图可以发现:

a.最外边全是1;

b.每个数是它上一行左右两数之和;

c.第n行有n个数字;

d.每行数字左右对称(第一行除外)。

   解题关键在于每个数是它上一行左右两数之和,这里定义一个二维数组arr来存放要打印的数字,那么第i行j列的元素可以表示为arr[i][j] = arr[i-1][j-1] + arr[i-1][j]。

3、源代码

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:PascalTriangle.c
* 功能:打印杨辉三角
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年4月4日22:16:10
*/

# include <stdio.h>
# include <assert.h>

# define ROW 20
# define COLUMN 20

/*
*
*	函数名称:PascalTriangle
*
*	函数功能:计算杨辉三角
*
*	入口参数:p, len
*
*	出口参数:void
*
*	返回类型:void
*/

void CalcPasTriangle(int (* p)[COLUMN], int len)
{
	int i = 0;
	int j = 0;

	assert(NULL != p);

	for (i=0; i<len; i++)
	{
		*(*(p+i)) = 1;
		*(*(p+i)+i) = 1;

		for (j=1; j<i; j++)
		{
			*(*(p+i)+j) = *(*(p+i-1)+j) + *(*(p+i-1)+j-1);
		}
	}

	return;
}

/*
*
*	函数名称:PrintTriangle
*
*	函数功能:打印杨辉三角
*
*	入口参数:p, len
*
*	出口参数:void
*
*	返回类型:void
*/

void PrintTriangle(int (* p)[COLUMN], int len)
{
	int i = 0;
	int j = 0;
	
	assert(NULL != p);

	if (len > 0)
	{
		for (i=0; i<len; i++)
		{
			//打印空格
			for (j=0; j<len-i-1; j++)
			{
				printf("    ");
			}
			//打印数字
			for (j=0; j<=i; j++)
			{
				printf("%-8d", *(*(p+i)+j));
			}

			printf("\n");
		}
	}
	else
	{
		printf("input error!\n");
	}
}

int main(void)
{
	int row = 0;
	int triangle[ROW][COLUMN] = {0};

	printf("input row:");
	scanf("%d", &row);

	CalcPasTriangle(triangle, row);
	PrintTriangle(triangle, row); 
	
	return 0;
}

4、输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/79826482
今日推荐