2021年西北农林科技大学信息工程学院c语言阶段二A(用一维动态数组实现杨辉三角形)

2021年西北农林科技大学信息工程学院c语言阶段二A

1529: 用一维动态数组实现杨辉三角形

题目描述

编程实现杨辉三角形各个元素的计算,并按要求的格式输出。需要注意如下细节:

(1) 行数未知,需要根据输入的正整数n确定。

(2) 计算得到的所有结果数据需要保存在一个一维动态数组p中。

(3) 不能改变指定的函数原型,只提交要求的createline()函数,其他代码不用提交。

以下给出了主函数main()和其他相关函数实现(从此处用wget命令取得这些代码),请设计完成单行数据的生成函数。在提交时,只提交createline()函数据的实现代码

函数原型规定为:unsigned int *createline(unsigned int *p, int line);

其中p是指向一维动态数组首地址的指针,line是需要生成数据的行号(从1开始计数,且line>=3)。函数返回的是生成的该行数据的首地址。

输入

需要生成的杨辉三角形行数n

输出

生成的n行杨辉三角形

样例输入

5

样例输出

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

#include <stdio.h>
#include <stdlib.h>

/* 构建杨辉三角形 */
unsigned int *create_yanghui(size_t);
/* 构建第n行(n>=3)的杨辉三角形单行数据 */
unsigned int *createline(unsigned int *, int);
/* 销毁杨辉三角形 */
void destory_yanghui(unsigned int *);
/* 输出杨辉三角形 */
void print_yanghui(unsigned int *, size_t);

unsigned int *createline(unsigned int *p, int line);
unsigned int *createline(unsigned int *p, int line){
    int i,n=line;
    p[3]=1;p[4]=2;
    for(i=line*(line-1)/2;i<line*(line+1)/2;i++){
        p[i]=p[i-n]+p[i-n+1];
    }
    p[line*(line-1)/2]=1;
    p[line*(line+1)/2-1]=1;
    return p;
}

int main()
{
    unsigned int *pyh = NULL;
    int num;

    scanf("%d", &num);
    if (num < 3)
        return 0;
    pyh = create_yanghui(num);
    print_yanghui(pyh, num);
    destory_yanghui(pyh);
    pyh = NULL;
    return 0;
}

unsigned int *create_yanghui(size_t num)
{
    size_t total_size;
    int i;
    unsigned int *p = NULL;

    total_size = (num * num + num) / 2;
    p = (unsigned int *)malloc(total_size * sizeof(unsigned int));
    if (p == NULL) {
        printf("Not enough row's memory!\n");
        exit(1);
    }

    p[0] = p[1] = p[2] = 1;
    for (i = 3; i <= num; i++) {
        createline(p, i);
    }
    return p;
}

void destory_yanghui(unsigned int *pyh)
{
    free(pyh);
}

void print_yanghui(unsigned int *pyh, size_t num)
{
    int i, j;

    for (i = 1; i <= num; i++) {
        for (j = 1; j <= i; j++) {
            printf("%d ",
                   pyh[((i - 1) * (i - 1) + i) / 2 + (j - 1)]);
        }
        printf("\n");
    }
}

题目中仅需要提交

unsigned int *createline(unsigned int *p, int line);函数

注意先读题知道要写的那一部分函数有什么作用,每一个变量代表什么。

因为题目使用一维数组实现杨辉三角,所以定不会出现什么类似p[n][m]之类的值;

1 p[0]

1 p[1] 1 p[2]

1 p[3] 2 p[4] 1 p[5]

1(6) 3(7) 3(8) 1(9)

1(10) 4(11) 6(12) 4 (13)1(14)

提示(很重要与答案密不可分)

(1) 杨辉三角形每行数据元素的个数就是行数。

(2) n行杨辉三角形的所有元素总数是n*(n+1)/2。

(3) 第n行数据在一维数组中的地址偏移是:n*(n-1)/2。

(4) 每行除第1个和最后一个数据值为1之外,其余数据均为前一行数据对应列数据及其前项数据之和。

p[0] = p[1] = p[2] = 1;

for (i = 3; i <= num; i++) {

createline(p, i);

}

unsigned int *createline(unsigned int *p, int line){

int i,n=line;

p[3]=1;p[4]=2; i从3开始 偏移量3*4/2=6在p[6](在第四行),所以前三行我都手动赋了值

for(i=line*(line-1)/2;i<line*(line+1)/2;i++){

p[i]=p[i-n]+p[i-n+1];

} 遍历每一行第一个到最后一个数 逐个复制(找规律)

p[line*(line-1)/2]=1;

p[line*(line+1)/2-1]=1; 最后把每行第一个和最后一个数重新赋值为1

return p;

}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511511511

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值