目录
python杨辉三角形计算
第十四届蓝桥杯青少年组python比赛省赛真题
一、题目要求
(注:input()输入函数的括号中不允许添加任何信息)
1、题目描述
杨辉三角就是一个用数排列起来的三角形(如下图),杨辉三角规则如下
- 每行第一个数和最后一个数都为1,其它每个数等于它左上方和右上方的两数之和
- 第n行有n个数
注意:“列”指的是如图所标注的斜列
2、编程实现
小青对杨辉三角的特点和规律研究得很明白,,现要考察你对杨辉三角的熟悉程度,首先告知你这是一个N行的杨辉三角,然后又告知了两个数值X和Y(X表示第几行,Y表示第几列),让你根据杨辉三角的特点和观察到的规律解决以下两个问题。
- 第X行第Y列对应的数是多少
- 求出N行的杨辉三角中第Y列中所有数的和
例如:N=5,5行的杨辉三角如下图:
X=5,Y=3,第5行第3列对应的数为6;第3列中所有数的和为10(10=6+3+1)。
3、输入输出
输入描述:第一行输入一个正整数N(2≤N≤30),表示杨辉三角的行数
第二行输入两个正整数X和Y(1≤Y≤X≤N),分别表示第X行和第Y列,正整数之间以一个英文逗号隔开
输出描述:输出两个整数,分别表示N行的杨辉三角中第X行Y列对应的数,及第Y列上所有数的和,两个整数之间以一个英文逗号隔开
输入样例:
5
5,3
输出样例:
6,10
二、算法分析
- 题目相对而言有一定的难度,难在杨辉三角形的构建
- 根据杨辉三角的特点,每一行的第一个和最后一个数都是1,可以直接返回1。
- 根据规律可知,在第X行,第Y列的数是由第X-1行的第Y-1列和第Y列的数相加得到的,即 lst[X][Y] = lst[X-1][Y-1] + lst[X-1][Y]。
- 创建一个二维数组lst,大小为[N][N],初始化所有元素为0。
- 使用两层循环,外层循环控制行数i,内层循环控制列数j。
- 将每行的第一个元素赋值为1
- 其它的根据规律计算当前位置的数值并赋值给lst[i][j]。
- 第X行第Y列对应的数为lst[X-1][Y-1]。
- 计算第Y列中所有数的和,使用一个变量resy初始化为0,然后用一个循环将位于第Y列的每个元素累加到resy中。
- 返回第Y列中所有数的和resy
三、程序编写
n = int(input())
res = resy = 0
x,y = map(int,input().split(','))
lst = [[0 for i in range(n+1)] for j in range(n+1)]
lst[1][1] = 1
for i in range(2,n+1):
lst[i][1] = 1
for j in range(2,i+1):
lst[i][j] = lst[i-1][j-1] + lst[i-1][j];
res = lst[x][y];
for i in range(n+1):
resy += lst[i][y]
print("{},{}".format(res,resy))
四、程序说明
- 首先,程序读取一个整数n,这个整数将用于创建一个(n+1) x (n+1)的二维数组lst
- 然后,程序读取两个整数x和y,这个坐标表示lst的索引
- 接下来,程序初始化两个变量res和resy为0
- 然后,程序将lst的第一个元素设置为1
- 然后,程序使用嵌套循环计算lst中的其他元素。具体来说,对于每一行i和每一列j,lst[i][j]等于lst[i-1][j-1]加上lst[i-1][j]
- 接下来,程序将res设置为lst[x][y],即给定坐标的元素值
- 然后,程序循环遍历lst的每一行,将该行的第y列元素累加到resy中
- 最后,程序输出格式化字符串"{},{}".format(res,resy);这个字符串包含了res和resy的值,用逗号分隔。
五、运行结果
5
5,3
6,10
六、考点分析
难度级别:中等,这题相对而言还是有一点小难度,难在构建杨辉三角形,具体主要考查如下:
- 学会分析题目,找到解题思路
- 学会简单的算法知识的应用
- input函数:Python 中 input() 函数接受一个标准输入数据,返回为 string 类型。
- int函数:强制将传入对象转换成整数类型
- split函数:按照指定的分隔符进行分割
- map函数:将指定的对象按照指定的函数进行迭代,在这里是将时分秒字符串类型数据按int整数类型数字返回输出(相当于多个变量强制类型转化)
- list函数:强制将参数转化成列表对象
- 学会列表的相关操作:列表声明、取数、遍历等等
- 学会while循环的使用:一般在不知道循环条件下推荐使用,条件不成立执行循环体,成立退出循环体
- 学会for循环的使用:for循环可以遍历任何有序的项及列表元素等等。
- range函数:rang(a,b),循环的时候是不包括b的,所以我们这个案例中要转变一下,要想包含b,就应该写成range(a,b+1)
- 学会if...条件判断语句的使用:满足条件才执行相应的程序
- 学会if...else双分支语句的使用:满足条件执行一种处理程序,不满足执行另一种处理程序
- print函数:用于打印输出,最常见的一个函数。
- 充分掌握for循环和列表相关操作函数的使用
PS:方式方法有多种,小朋友们只要能够达到题目要求即可!