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、输出结果