• 在屏幕上打印杨辉三角


    我们先来看看杨辉三角长什么样的:

     我们一起来看一看它的规则:

    1.  每一行的第一个数字和最后一个数字都是1

    2.  从第三行开始,中间的数字和最后一个数字等于它上方两个数字之和

    我们可以很好的发现下面的数字就是由该数字上面一行和上一列加上该数字的上一行和该数字的那一列,如上图的箭头所示,既然我们找到了规律。

    接下来我们就来一步一步的实现我们的代码:上面经过分析,对于数值我们可以用二维数组进行接收,那么这样便于我们对于对于这种我们都轻车熟路的用到两个for循环,外循环表示则表示有多少行,内循环则表示有多少列,我们可以发现我们的列数与我们的行数是相等的。每一行的第一个数字和最后一个数字都是1,那么对于1的实现,在j = 0 时或者 j= i时就规定为1,下面我们以一个7行的杨辉三角为例:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. int main()
    4. {
    5. int arr[7][7] = { 0 };
    6. for (int i = 0; i < 7; i++)
    7. {
    8. for (int j = 0; j < i; j++)
    9. {
    10. if (j == 0 || j == i)//为1的情况
    11. {
    12. arr[i][j] = 1;
    13. printf("%d ",arr[i][j]);
    14. }
    15. else
    16. {
    17. arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
    18. printf("%d ", arr[i][j]);
    19. }
    20. }
    21. printf("\n");
    22. }
    23. return 0;
    24. }

    我们来看看运行效果:

    那么上面我们知道:从第三行开始,中间的数字和最后一个数字等于它上方两个数字之和,那么我们可不可以通过函数递归的方法呢:因为我们知道前三个为1,那么计算第i行第j列的数值时,我们可不可以一步一步的推回去呢,答案是可以的!对于1的位置,我们规定为1就好了:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. int com(int n, int k)
    4. {
    5. if (k == 0 || k == n)
    6. return 1;
    7. else
    8. return com(n - 1, k - 1) + com(n - 1, k);//上一行的前一列和本列的上一行
    9. }
    10. // 打印杨辉三角
    11. void Triangle(int n)
    12. {
    13. for (int i = 0; i < n; i++)
    14. {
    15. // 打印每一行的数字
    16. for (int j = 0; j <= i; j++)
    17. {
    18. printf("%d ", com(i, j));
    19. }
    20. printf("\n");
    21. }
    22. }
    23. int main()
    24. {
    25. int n = 0;
    26. printf("请输入要打印的杨辉三角的行数:");
    27. scanf("%d", &n);
    28. // 调用函数打印杨辉三角
    29. Triangle(n);
    30. return 0;
    31. }

    我们来看看效果:


    杨辉三角有很多的摆法,下面我们来看看这种:

     那么我们先来看看前面的空格,前面的空格依次减少,所以我们的空格是跟着行数在变化的:

    1. for (space = 1; space <= rows - i; space++)
    2. {
    3. printf(" "); // 打印空格
    4. }

     后面的数值部分,我们可以用到上面那种方法,这里就不用上面那种方法了,我看见其他的公式:a = a * (i - j + 1) / j

    对于这种,我真不知道他们是怎么推导出来的,真的挺佩服他们的!

    1. int main()
    2. {
    3. int rows, a = 1, space, i, j;
    4. printf("请输入要打印的行数: ");
    5. scanf("%d", &rows);
    6. for (i = 0; i < rows; i++)
    7. {
    8. for (space = 1; space <= rows - i; space++)
    9. {
    10. printf(" "); // 打印空格(两个空格)
    11. }
    12. for (j = 0; j <= i; j++)
    13. {
    14. if (j == 0 || i == 0)
    15. {
    16. a = 1;
    17. }
    18. else
    19. {
    20. a = a * (i - j + 1) / j;
    21. }
    22. printf("%4d", a); // 打印系数
    23. }
    24. printf("\n");//换行
    25. }
    26. return 0;
    27. }

    看看运行效果:

     你们知道是怎么推导出来的吗?教教我呗😳😳😳

  • 相关阅读:
    Nginx-HTTPS 配置
    笔试强训第16天
    Vue使用总结-包括Vue2和Vue3
    【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果
    互联网医院系统源码:预约问诊小程序的开发方案详解
    【笔记】29元microbit套装如何玩——套装硬件简介
    【先序遍历 深度优先搜索】1028. 从先序遍历还原二叉树
    Solidity 合约漏洞,价值 38BNB 漏洞分析
    混沌系统在图像加密中的应用(索尔顿海生态流行病学问题的混沌性)
    区块相隔虽一线,俱在支付同冶熔,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask区块链虚拟三方支付功能
  • 原文地址:https://blog.csdn.net/2302_77675796/article/details/134452263