用一维数组实现杨辉三角

题目:给定你一个整数 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指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值