题目
问题描述
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
输入格式
输入包含一个数n。
输出格式
输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。
样例输入
4
样例输出
1
1 1
1 2 1
1 3 3 1
数据规模与约定
1 <= n <= 34。
代码
import math
n = input()
n = int(n)-1
j = 0
def C(n,r):
c = n-r
n = math.factorial(n)
r = math.factorial(r)
c = math.factorial(c)
num = n/(r*c)
return int(num)
for r in range(n+1):
if r ==0:
print(1,end='')
print('\n',end='')
continue
else:
while True:
print(C(r, j),end=' ')
j+=1
if j>r:
j=0
print('\n',end='')
break
## 分析
我们利用二项式的原理,代码中 `n = int(n)-1`就是利用了(a+b)^i的系数展开就为i+1上面的数值这个规律,所以要在最大的底数上减1。其实这样写代码是为了方便理解,第二次range函数又把那个1加回去了,是因为range函数取不到尾数,但是我们始终要知道,这个底数是要在行数的基础上减一的。
math中的factorial()函数是用来计算阶层的,这样我们就没必要再写一个递归去实现阶层的运算了。
`print("\n")`后面之所以还要加一个`end=''`是因为如果不加,那么一个print("\n")在循环里面,想大于打印了两个换行符。这样是不符合题意的。
j就是底数,底数从0一直增到第n-1。