【已解决】蓝桥杯 2017年C组第五题 杨辉三角(分析与总结)

励志用少的代码做高效表达


题目描述:

杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要。

第0行: 1
第1行: 1 1
第2行: 1 2 1
第3行: 1 3 3 1
第4行: 1 4 6 4 1


两边的元素都是1, 中间的元素是左上角的元素与右上角的元素和。

我们约定,行号,列号都从0计数。
所以: 第6行的第2个元素是15,第3个元素是20

直观地看,需要开辟一个二维数组,其实一维数组也可以胜任。
如下程序就是用一维数组“腾挪”的解法。


分析与思考

代码填空题一般来讲都是考查递归或递推(因为其他的也没什么好考查的, 一个调试就出来了)。 相对来说是三种题型中技巧性最高、也是不太容易得分的一道题。

这里讲一讲我解代码填空的技巧

首先确定他的题型, 如果不是递归或递推,只是输出某种图案或结构,那么直接采用输出测试、注释、调试等手段, 慢慢可以试出答案。

如果是递归、回溯、递推等题型,那么就需要先手算出大致的推理过程, 最后填入代码。 如本题就是一道递推题, 我们先将n等于2,3,4,5分别求出, 根据初始条件推理如何才能得到这种解, 一层一层的分析, 最后可以比较容易的得到递推公式。

当然, 今天离蓝桥杯省赛还有两天的时间, 如果觉得自己对递归了解不够,不具备这样的能力, 那就瞎试吧, 成功率也是蛮高的。

总结一下技巧:手算推导、输出测试、注释输出、调试、随机测试(瞎试) (如果对你产生了帮助, 记得给博主一个赞哟)

上程序

#include<bits/stdc++.h>
using namespace std;

long long f(int row, int col){
    
    
	if(row<2) return 1;
	if(col==0) return 1;
	if(col==row) return 1;
	
	long long a[1024];
	a[0]=1;
	a[1]=1;	
	int p = 2;
	int q;
	
	while(p<=row){
    
    
		a[p] = 1;
		for(  q=p-1;q>0;q-- ) a[q] = a[q] + a[q-1]; //填空
		p++;
	}
	
	return a[col];
}

int main()
{
    
    
	printf("%d\n", f(6,2));
	printf("%d\n", f(6,3));
	printf("%lld\n", f(40,20));	
	return 0;
}

把手举过头顶,突然张开五指,那么,恭喜你给自己放了个烟花!

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/109066064
今日推荐