题目:
输入一个正整数n,实现打印n行的杨辉三角形。例如下图:
解题思路:
观察杨辉三角形的规律,从下图来找杨辉三角形的规律要容易一些:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
题目中要求的杨辉三角,不过是上图中每行控制一下输出数字前的输出空格个数来实现的。观察上图,可以很清楚的发现规律,如果以一个二维数组来存储杨辉三角,那么当列标为0时或者行标与列标相等时值为1。当不满足前面条件时,值大小符合a[i][j] = a[i-1][j] + a[i-1][j-1],即等于它正上方和左上方的两个数字相加。从整体输出来看,只有在列号小于等于行号时才输出数组的值。
每行输出空格的数目确定,我主要是根据该数对其的最下面的数的左面空格和数的总数来决定的,如将要输出10行的杨辉三角,那么第一行左侧空格和数加起来有9个,我输出18个空格,第二行左侧空格和数加起来有8个,我输出16个空格。这样的杨辉三角形比较接近等边三角形。
程序代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
int i,j,k;
int a[100][100];
printf("你想输出几行的杨辉三角形:");
scanf("%d",&n);
for(i = 0; i < n; i++){//控制行
for(k = (n-i-1)*2; k >0; k--){//输出空格
putchar(' ');
}
for(j = 0; j <= i; j++){//控制列
if(i == j || j == 0){
a[i][j] = 1;
printf("%5d",a[i][j]);//保证数字间的空间
}
else{
a[i][j] = a[i-1][j] + a[i-1][j-1];
printf("%5d",a[i][j]);
}
}
putchar('\n');
}
return 0;
}
运行结果:
你想输出几行的杨辉三角形:10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1