Python打印杨辉三角

题目:python打印杨辉三角

杨辉三角性质有很多,我们的程序主要运用以下性质

  • 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
  • 第n行的数字有n项

大致形状(来自百科)

在这里插入图片描述

程序运行效果

n = 5
    1 
   1 1  
  1 2 1  
 1 3 3 1  
1 4 6 4 1  
n = 10
                           1 
                        1     1      
                     1     2     1      
                  1     3     3     1      
               1     4     6     4     1      
            1     5     10    10    5     1      
         1     6     15    20    15    6     1      
      1     7     21    35    35    21    7     1      
   1     8     28    56    70    56    28    8     1      
1     9     36    84    126   126   84    36    9     1      
n = 20
                                                                                               1 
                                                                                          1         1          
                                                                                     1         2         1          
                                                                                1         3         3         1          
                                                                           1         4         6         4         1          
                                                                      1         5         10        10        5         1          
                                                                 1         6         15        20        15        6         1          
                                                            1         7         21        35        35        21        7         1          
                                                       1         8         28        56        70        56        28        8         1          
                                                  1         9         36        84        126       126       84        36        9         1          
                                             1         10        45        120       210       252       210       120       45        10        1          
                                        1         11        55        165       330       462       462       330       165       55        11        1          
                                   1         12        66        220       495       792       924       792       495       220       66        12        1          
                              1         13        78        286       715       1287      1716      1716      1287      715       286       78        13        1          
                         1         14        91        364       1001      2002      3003      3432      3003      2002      1001      364       91        14        1          
                    1         15        105       455       1365      3003      5005      6435      6435      5005      3003      1365      455       105       15        1          
               1         16        120       560       1820      4368      8008      11440     12870     11440     8008      4368      1820      560       120       16        1          
          1         17        136       680       2380      6188      12376     19448     24310     24310     19448     12376     6188      2380      680       136       17        1          
     1         18        153       816       3060      8568      18564     31824     43758     48620     43758     31824     18564     8568      3060      816       153       18        1          
1         19        171       969       3876      11628     27132     50388     75582     92378     92378     75582     50388     27132     11628     3876      969       171       19        1  

代码实现

1.阶乘函数

计算组合数时要用到阶乘

def factorial(n):
    if n == 1 or n == 0:
        return 1
    else:
        return (n*factorial(n-1))

2.组合数函数

根据组合数的公式,直接写出组合数函数

def Coefficient(n,k):
    num = factorial(n) / (factorial(k) * factorial(n-k))
    return int(num)

3.杨辉三角函数

写的过程并不复杂,但会发现问题,比较大的问题就是对齐的问题,而且会随着数字位数增多会重复出现问题,所以我们最好找到一个系数动态解决这个问题。
最后找到的解决方案是,预留空间,计算出n阶杨辉三角最大的数的位数记为space,那么给每个数两倍的space空间(数字长度+空格),可解决对齐的问题(因为这时相当于每个数所占空间相同)

def YangHui():
    n = int(input("输入杨辉三角阶数:"))

    # 计算二项式系数最大数长度,以便对齐
    if (n - 1) % 2 == 0:
        space = len(str(Coefficient(n - 1, (n - 1) / 2)))
    else:
        space = len(str(Coefficient(n - 1, n / 2)))

    # 控制换行
    for i in range(1,n+1):
        print((n-i)*space*' ',end="")
        # 控制每一行内容
        if i == 1:
            print(1,end="")
        else:
            for j in range(0,i):
                num = Coefficient(i-1,j)
                length = len(str(num))
                print(str(num)+(space-length)*' ',end="") #空格是为了给num空间,num空间(数字长度+空格数)要与数字后空格数相同,否则对齐混乱
                print(space*' ',end="")  #每个数字后的空格数
        print(' ') # 用于换行

4.最终代码

#定义阶乘
def factorial(n):
    if n == 1 or n == 0:
        return 1
    else:
        return (n*factorial(n-1))
# 定义二项式系数
def Coefficient(n,k):
    num = factorial(n) / (factorial(k) * factorial(n-k))
    return int(num)

# 定义杨辉三角
def YangHui():
    n = int(input("输入杨辉三角阶数:"))

    # 计算二项式系数最大数长度,以便对齐
    if (n - 1) % 2 == 0:
        space = len(str(Coefficient(n - 1, (n - 1) / 2)))
    else:
        space = len(str(Coefficient(n - 1, n / 2)))

    # 控制换行
    for i in range(1,n+1):
        print((n-i)*space*' ',end="")
        # 控制每一行内容
        if i == 1:
            print(1,end="")
        else:
            for j in range(0,i):
                num = Coefficient(i-1,j)
                length = len(str(num))
                print(str(num)+(space-length)*' ',end="") #空格是为了给num空间,num空间(数字长度+空格数)要与数字后空格数相同,否则对齐混乱
                print(space*' ',end="")  #每个数字后的空格数
        print(' ') # 用于换行
YangHui()

2020/6/25在leetcode看到一种数据更小的算二项式系数的办法,不过是java代码,这样可以用一个循环就代替原先的阶乘。

private int Combination(int N, int k) {
    long res = 1;
    for (int i = 1; i <= k; i++)
        //通过分数的形式可以巧妙地避免数据溢出,先约掉分母和分子的一部分
        res = res * (N - k + i) / i;
    return (int) res;
}
  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值