解题思路:

解题思路啊,我就是当初想多了其他前辈们解决其他题目的想法而已,size其实可以没有来着这题,我一直就是想要用一维数组解决而已

思路就下面这个啊

/*

1 a[0]=1

1 1  a[0]=1 a[1]=1

1 2 1 a[0]=1 a[1]=2 a[2]=1

1 3 3 1  a[0]=1 a[1]=3 a[2]=3 a[3]=1

*/



注意事项:

为什么要第二个for循环逆序遍历呢那个是因为,来来来 ,大家看看豆包的答案啊不,解释啊

1.从后往前计算的必要性

当使用一维数组来模拟杨辉三角的计算时,如果按照for (int j = 0; j <= i; j++)(从前往后)的顺序进行计算,会出现一个问题。在计算当前行的元素时,由于杨辉三角的特性(每个元素是它上方两数之和),我们需要用到上一行的元素。

例如,当计算a[j](当前行第j个元素)时,它等于上一行的a[j - 1]和a[j](上一行同位置和前一个位置的元素)之和。但是如果从前往后计算,在计算a[j]时,

a[j - 1]已经被更新为当前行的值了,就无法获取到上一行a[j - 1]的正确值。

2.从后往前计算的好处

而使用for (int j = i; j >= 0; j--)(从后往前)的顺序计算时,当计算a[j](当前行第j个元素),因为是从后往前计算,a[j - 1]还没有被更新为当前行的值,它仍然保留着上一行的正确值。

比如,对于第三行(i = 2),我们要计算a[1],按照从后往前的顺序,先计算a[2] = 1,然后计算a[1],此时a[0]还是上一行的值(也就是 1),可以正确地计算出a[1]=a[1]+a[0](这里a[1]初始为 0,计算后为 2),这样就能保证每个元素的计算都是基于上一行的正确值。

我的代码一直不难于理解,大家可以尝试优化一下下,放心简单,不难

嗷嗷嗷,我就喜欢夸我自己,怎么这么爱超级简单好理解的题解,哼,我隔壁的大学霸当初看了我的一版代码就摇头,说救不回来了这代码,没想到吧,我和豆包合体救回来啦

大家加油呀,冲冲冲~

参考代码:

#include <stdio.h>

int main()

 {

    int n=0,size=0 ;

    while(~scanf("%d", &n))

    {

        int a[31] = {0};  

        size=0 ;

        for (int i = 0 ; i < n; i++ )

        {

                for (int j = size ; j >=0  ; j-- )

                //我一开始就是这个部分错误了 ,大家注意点

                {

                        if (j == 0 || j == size)

                        {

                                a[j] = 1; 

                                printf("%d ", a[j]); 

                        } 

                        else 

                        {

                                a[j] = a[j] + a[j - 1]; 

                                printf("%d ", a[j]);

                        }

                }

                size++ ;

                printf("\n");

        }

        printf("\n") ;

    }

    return 0;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论