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;
}