题目:给定你一个整数 n ,输出一个对应层数的杨辉三角。
我们先来观察杨辉三角的特征
n = 1 1
n = 2 1 1
n = 3 1 2 1
n = 4 1 3 3 1
n = 5 1 4 6 4 1
n = 6 1 5 10 10 5 1
从第三行开始,每行第二个数直到倒数第二个数,均为头顶上方两个数的和
那么问题来了,为什么从第三行开始?为什么每行第一个数和最后一个数却不符合?
那么这个时候我们不妨假设在杨辉三角最外层有一圈 0
n = 1 0 1 0
n = 2 0 1 1 0
n = 3 0 1 2 1 0
n = 4 0 1 3 3 1 0
n = 5 0 1 4 6 4 1 0
n = 6 0 1 5 10 10 5 1 0
这样看来问题就简化了很多,这个时候我们只需用一个辅助数组,这个辅助数组的作用就是用来记录第 n-1层的数就行了,代码如下:
#include<stdio.h>
#define MAXN 100
int arry[MAXN], copyarry[MAXN];//copyarry为辅助数组
int main()
{
int n, index, cnt, i, j;
scanf("%d", &n);
arry[1] = copyarry[1] = 1;//初始化为第一层
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
if(j != 1) printf(" ");
printf("%d",arry[j]);
}
for(index = 1,cnt = 1;index <= i + 1; index++, cnt++)// index 为第 n 层的下标,cnt 为上一层的下标
{
arry[index] = copyarry[cnt-1] + copyarry[cnt];
}
for(index = 1; index <= i + 1;index++)//这里是更新上一层的数组
{
copyarry[index] = arry[index];
}
printf("\n");
}
printf("\n");
return 0;
}
之前写完有点小遗憾,就是辅助数组更新的问题,有没有一种可能不用更新,就是轮流做辅助数组,这个问题就留给读者了。
当然也在百度看到过一些别的解法,比较简洁,根据个人喜好吧,选择自己喜欢的解法。
此篇拙作,如果错误请dalao指正。