写在前面:
题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在教材或其他学习资源找到这些内容学习。😀
本题的预备知识:
- 变量的定义与赋值操作
- 输入(scanf)输出(printf)语句
- for循环语句及其嵌套
- 二维数组的使用
在屏幕上显示杨辉三角形
成绩 | 10 | 开启时间 | 2020年03月28日 星期六 08:05 |
折扣 | 0.8 | 折扣时间 | 2020年04月20日 星期一 23:05 |
允许迟交 | 是 | 关闭时间 | 2020年04月30日 星期四 23:05 |
编写程序,输入正数n, 在屏幕上显示对应的杨辉三角形(注意数据之间的空格)。例如:n=5 图形如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 |
|
| 1秒 | 64M | 0 |
测试用例 2 |
|
| 1秒 | 64M | 0 |
题解
本题的思路主要是考虑将一个杨辉三角通过计算储存在一个二维数组中,然后将有效部分输出即可。那么本题的重点就是计算杨辉三角。
根据杨辉三角的特点,我们可以由上一行推出下一行,那么我们的计算过程就是一个自顶向下的求解过程。为了方便,我们杨辉三角的储存的行下标从1开始,列下标也从1开始。如下图,如果在每行的两侧均补上0,那么我们的计算下一行的每一个元素均可通过其上方和左上方元素之和求得。即:a[ i ][ j ] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]
代码实现
本题一个很巧妙的操作就是将每一行两侧赋值为0,来方便简化讨论。其实在代码实现的时候,是把二维数组a全都初始化赋值为0的。
杨辉三角的结构也很好理解:对于输入的h,应该计算的杨辉三角是h-1行。设行号为i = 1..h-1,那么每一行应该是有 i 列。
#include <stdio.h> //导入stdio.h库,里面包含输入输出函数
int main() {
int h, a[100][100] = {0}; //定义一个100x100的二维数组a,并全都初始化为0
scanf("%d", &h);
a[1][1] = 1; //设置第一行
/* 依次计算第 2~h+1 行 */
for (int i = 2; i <= h + 1; i++)
for (int j = 1; j <= i; j++)
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
/* 输出杨辉三角的部分 */
for (int i = 1; i <= h + 1; i++) {
for (int j = 1; j <= i; j++)
printf("%3d", a[i][j]);
printf("\n");
}
}
注意:
- 数组的初始化操作有很多种,书上应该讲的很详细。这里强调一下本题的将数组内的空间一并赋值的情况,也就是 a[ 100 ][ 100 ] = {0} ,这里是将数组a的空间内全部赋值为 0。如果你说要全部赋值为1行不行?其实是不行的...只有0才能这样简化操作喔。(感兴趣可以搜搜 string.h 库种 memset 函数的使用,用于数组初始化的)
- 根据题目的输出结构,我们可以发现结果中的每一个数都是占了三位的,并且向右对齐。故输出时要记得规定格式 %3d。
有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~
end
欢迎关注个人公众号“ 鸡翅编程 ”,这里是认真且乖巧的码农一枚。
---- 做最乖巧的博客er,做最扎实的程序员 ----
旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~