C语言每日一练——第105天:杨辉三角形

这篇具有很好参考价值的文章主要介绍了C语言每日一练——第105天:杨辉三角形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌟 前言

Wassup guys,我是Edison😎

今天是C语言每日一练,第105天!

Let’s get it!

谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++



1. 题目描述

杨辉三角形

解题之前,我们先来了解一下杨辉三角形到底是什么?

杨辉三角形,又称帕斯卡三角形、贾宪三角形、海亚姆三角形,它的排列形如三角形。
 
因为首现于南宋杨辉的《详解九章算法》得名,而书中杨辉说明是引自贾宪的《释锁算书》,故又名贾宪三角形。
 
古代波斯数学家欧玛尔·海亚姆也描述过这个三角形。在欧洲,因为法国数学家布莱兹‧帕斯卡在1653年的《论算术三角》中首次完整论述了这个三角形,故也被称作帕斯卡三角(Pascal’s triangle)。
 
杨辉三角的前10行写出来如下👇
谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

2. 解题思路

其实规律很简单,我们来看一看

在最上面一行的中央写下数字 1;
 
第二行,写下两个1,和上一行形成三角形;
 
随后的每一行,开头和最后的数字都是1,其他的每个数都是它左上方和右上方的数之和,就是说除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和。
谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

3. 动图演示

谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

4. 代码实现

我们通过动图可以得出以下结论👇

1、两边都是数字1;
 
2、从第三行开始,除了两边的数字1之外的数字都是由 “肩膀上” 的数字相加得到的。
 
对于算法不太熟悉的朋友,如果直接去打印,可能就比较困难,所以我们不妨拆开几步来做。

🍑 Step1

1、定义一个9行9列的二维整型数组;
 
2、数组所有元素都赋值为1;
 
3、输出数组所有元素

#include <stdio.h>

int main()
{
    //定义一个9行9列的二维整型数组
    int data[9][9];

    int i = 0;
    int j = 0;

    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9; j++)
        {
            //数组所有元素都赋值为1
            data[i][j] = 1;
        }
    }

    //输出数组所有元素
    for (i = 0; i < 9; i++)
    {
         for (j = 0; j < 9; j++)
         {
             printf("%6d", data[i][j]);
         }
         printf("\n");
    }
    return 0;
}

我们输出看一下👇

谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++
但是我们只需要左下角的数字
谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++
所以对第二个for循环进行修改,让j <= i

#include <stdio.h>

int main()
{
    //定义一个9行9列的二维整型数组
    int data[9][9];

    int i = 0;
    int j = 0;

    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9; j++)
        {
            //数组所有元素都赋值为1
            data[i][j] = 1;
        }
    }

    //输出数组所有元素
    for (i = 0; i < 9; i++)
    {
    	//修改j <= i
         for (j = 0; j <= i; j++)
         {
             printf("%6d", data[i][j]);
         }
         printf("\n");
    }
    return 0;
}

运行看一看

谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

🍑 Step2

中间位置的数字是由它上一行对应位置的数字以及上一行对应位置左侧的数字相加得到;
 
因为下一行的情况总需要由上一行的情况推出,即我们需要记录每一行的结果。
 
所以构建杨辉三角本质上是一个动态规划问题,我们可以总结出如下推导式:
 
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + d p [ i − 1 ] [ j ] dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] dp[i][j]=dp[i1][j1]+dp[i1][j]
 
其中,dp[i][j]表示第i行的第j个数。

#include <stdio.h>

int main()
{
    //定义一个9行9列的二维整型数组
    int data[9][9];

    int i = 0;
    int j = 0;

    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9; j++)
        {
            //数组所有元素都赋值为1
            data[i][j] = 1;
        }
    }

    //dp
    for (i = 1; i < 9; i++)
    {
        for (j = 1; j < i; j++)
        {
            data[i][j] = data[i-1][j] + data[i-1][j-1];
        }
    }

    //输出数组所有元素
    for (i = 0; i < 9; i++)
    {
         for (j = 0; j <= i; j++)
         {
             printf("%6d", data[i][j]);
         }
         printf("\n");
    }
    return 0;
}

运行结果👇

谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

🍑 居中显示

我们如何让杨辉三角形居中显示呢?

就像这样👇
谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

很简单,代码如下

        for (int k = 0; k < 26 - (6 * i / 2); k++)
        {
            printf(" ");
        }

这是什么意思呢?

1、每行前输出不等的空格;
 
2、为何i / 2?因为:居中只需左边加空格;
 
3、为何要乘6?因为:输出时用%6d
 
4、为何要用26减?因为:不大不小刚刚好😂
谢尔宾斯基三角形和杨辉三角,C语言每日一练,c语言,开发语言,后端,杨辉三角函数,c++

5. 完整代码

📝代码示例

#include <stdio.h>

int main()
{
    //定义一个9行9列的二维整型数组
    int data[9][9];

    int i = 0;
    int j = 0;

    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9; j++)
        {
            //数组所有元素都赋值为1
            data[i][j] = 1;
        }
    }

    //dp
    for (i = 1; i < 9; i++)
    {
        for (j = 1; j < i; j++)
        {
            data[i][j] = data[i - 1][j] + data[i - 1][j - 1];
        }
    }

    //输出数组所有元素
    for (i = 0; i < 9; i++)
    {
    	//用三角形的方式打印
        for (int k = 0; k < 26 - (6 * i / 2); k++)
        {
            printf(" ");
        }

        for (j = 0; j <= i; j++)
        {
            printf("%6d", data[i][j]);
        }
        printf("\n");
    }
    return 0;
}

6. 特性总结

杨辉三角的美妙之处在于:它是如此足够简单,但本身在数学上却拥有丰富的魅力。
 
这是数学中的最令人称奇的事物之一,随便取诸多数学性质中的某个,就能表明它是多么的精彩绝伦。
 
比如:隐藏数列、完全平方数、斐波那契数列、谢尔宾斯基三角、组合数学、二项式定理等等,这些都都可以在杨辉三角形中找到,你发现了吗?文章来源地址https://www.toymoban.com/news/detail-824426.html

到了这里,关于C语言每日一练——第105天:杨辉三角形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 实现杨辉三角形

    杨辉三角形,也被称为帕斯卡三角形,是一种由数字构成的三角形,它的特点是每个数字都是它上方两个数字的和。这个三角形是以法国数学家布莱兹·帕斯卡和中国数学家杨辉命名的。 杨辉三角形的原理可以通过以下步骤来解释: 第一行只有一个数字 1。 第二行有两个数字

    2024年02月15日
    浏览(34)
  • c语言每日一练(9)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、以下 scanf 函数调用选项中, 错误的是( ) A、scanf(\\\"%s\\\",a[0].n

    2024年02月12日
    浏览(37)
  • c语言每日一练(10)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、如果 x=2014 ,下面函数的返回值是( )  A、20   B、21    C、

    2024年02月11日
    浏览(38)
  • c语言每日一练(1)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、执行下面程序,正确的输出是( ) A.5,7     B.7,5    C.3,8   

    2024年02月14日
    浏览(41)
  • c语言每日一练(3)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、执行下面的程序段,语句3的执行次数为( ) A.n(n+2)/2    B.(

    2024年02月14日
    浏览(46)
  • c语言每日一练(5)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、下面代码的结果是:( ) A. a = 8 b = 23 c = 8      B. a = 9 b= 23 c =

    2024年02月13日
    浏览(75)
  • c语言每日一练(2)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、以下程序段的输出结果是() A.12    B.13    C.16    D.以上都

    2024年02月14日
    浏览(86)
  • c语言每日一练(8)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、请阅读以下程序,其运行结果是( )   A、YES       B、NO 

    2024年02月12日
    浏览(34)
  • c语言每日一练(7)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、下列定义数组的语句中正确的是【多选】( ) A、 B、char str

    2024年02月13日
    浏览(45)
  • C语言每日一练(二)

    解法一:在原链表中删除Node.next=next的节点 注意:当头节点的val==val时,要改变头节点的位置 解法二:创建新的指向头尾的链表 注意:这里如果写head的话,当一个节点是要删除的节点,头节点还是那个删除的节点。 解法一:创建新链表,对新链表进行头插 解法二:定义三个

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包