在屏幕上显示杨辉三角形

写在前面:

题解是对具体题目的编程实现,不会具体讲解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. 6↵
 
  1.   1↵
  2.   1  1↵
  3.   1  2  1↵
  4.   1  3  3  1↵
  5.   1  4  6  4  1↵
  6.   1  5 10 10  5  1↵
  7.   1  6 15 20 15  6  1↵
1秒64M0
测试用例 2 
  1. 4↵
 
  1.   1↵
  2.   1  1↵
  3.   1  2  1↵
  4.   1  3  3  1↵
  5.   1  4  6  4  1↵
1秒64M0

题解

本题的思路主要是考虑将一个杨辉三角通过计算储存在一个二维数组中,然后将有效部分输出即可。那么本题的重点就是计算杨辉三角。

根据杨辉三角的特点,我们可以由上一行推出下一行,那么我们的计算过程就是一个自顶向下的求解过程。为了方便,我们杨辉三角的储存的行下标从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");
    }
}

注意:

  1. 数组的初始化操作有很多种,书上应该讲的很详细。这里强调一下本题的将数组内的空间一并赋值的情况,也就是 a[ 100 ][ 100 ] = {0} ,这里是将数组a的空间内全部赋值为 0。如果你说要全部赋值为1行不行?其实是不行的...只有0才能这样简化操作喔。(感兴趣可以搜搜 string.h 库种 memset 函数的使用,用于数组初始化的)
  2. 根据题目的输出结构,我们可以发现结果中的每一个数都是占了三位的,并且向右对齐。故输出时要记得规定格式 %3d。


有任何问题欢迎评论交流,如果本文对您有帮助不妨点点赞,嘻嘻~ 


end 

欢迎关注个人公众号 鸡翅编程 ”,这里是认真且乖巧的码农一枚。

---- 做最乖巧的博客er,做最扎实的程序员 ----

旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

在这里插入图片描述

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值