解题思路:
解题思路啊,我就是当初想多了其他前辈们解决其他题目的想法而已,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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复