排列和组合计算程序

排列和组合计算程序

【引言】

每次计算排列和组合都是件麻烦的事情,下面的程序可以快速计算排列和组合。

【排列和组合】

次序不重要就叫组合,次序重要就叫排列(排列是有序的组合)。

排列有两种(次序重要):

可重复:像暗码锁的的暗锁,暗骂可以是“333”。

当一个东西有 n 个不同的类型时,我们每次就有 n 个选择。

$$ n^{r} $$

其中 n 是被选择的东西的个数,r 是我们要选的次数。可以重复,次序重要。

不可重复:像比赛的第一,二和三名。

每选一次就要减少一个。使用阶乘函数!

$$ \frac{n!}{\left (n-r \right)!} $$

其中 n 是被选择的东西的个数,我们需要在其中选择 r 个。不可以重复,次序重要。

另一种写法是:

$$ \text{P(n,r)} = \frac{n!}{\left (n-r \right)!} $$

组合也有两种(次序不重要):

可重复:

$$ \binom{r+n-1}{r} = \frac{\left(r+n-1 \right)!}{r!\left(n-1 \right)!} $$

其中 n 是被选择的东西的个数,我们在其中要选 r 个。可以重复,次序不重要。

不可重复:

$$ \text{C(n,r)} = \binom{n}{r} = \frac{n!}{\left r!(n-r \right)!} $$

其中 n 是被选择的东西的个数,我们需要在其中选择 r 个。不可以重复,次序不重要。

【程序】

#2020.11.11 15:37:50
#by stackboom.xin
#-----------------排列和组合的计算------------------#
print("计算排列和组合的数据,若n=?,r=?,则结果如下")
n = int(input("n取值为:"))
r = int(input("r取值为:"))
#------------------------------------------------#
#计算排列,n^r(序列重要,允许重复)#方法一valNcR = 1if n < 0:
    print("不能取负数!")
elif n == 0:
    print("不能取0!")
else:
    for i in range(1,r+1):
        valNcR *= n
calResult = int(valNcR)
print(f"{n}个数,序列重要,允许重复的话,一共有{calResult}种排列。")
#方法二
'''
import math
powNcR      = math.pow(n,r)
calResult   = int(powNcR)
print(f"{n}个数,序列重要,允许重复的话,一共有{calResult}种排列。")
'''
#------------------------------------------------#
#计算排列,n!/[r!(n-r)!](序列不重要,不允许重复)
#方法一
numN,denNsubR = 1,1if n < 0:
    print("负数无法阶乘!")
elif n == 0:
    print("0的阶乘为1!")
else:
    for i in range(1,n+1):
        numN *= i
    for i in range(1,(n-r)+1):
        denNsubR *= i
calResult = int(numN / denNsubR)
print(f"{n}个数,序列重要,不允许重复的话,一共有{calResult}种排列。")
#方法二
'''
import mathfactN       = math.factorial(n)
factNsubR   = math.factorial(n-r)
calResult   = int(factN / factNsubR)
print(f"{n}个数,序列重要,不允许重复的话,一共有{calResult}种排列。")
'''
#------------------------------------------------#
#计算组合,(r+n-1)!/[r!(n-1)!](序列不重要,允许重复)
#方法一
numRaddNsubOne,denR,denNsubOne = 1,1,1
if n < 0:
    print("负数无法阶乘!")
elif n == 0:
    print("0的阶乘为1!")
else:
    for i in range(1,(r+n-1)+1):
        numRaddNsubOne *= i
    for i in range(1,r+1):
        denR *= i
    for i in range(1,(n-1)+1):
        denNsubOne *= i
calResult = int(numRaddNsubOne / (denR * denNsubOne))
print(f"{n}个数,序列不重要,允许重复的话,一共有{calResult}种组合。")
#方法二
'''
import math
factRaddNsubOne = math.factorial(r+n-1)
factR           = math.factorial(r)
factNsubOne     = math.factorial(n-1)
calResult       = int(factRaddNsubOne / (factR * factNsubOne))
print(f"{n}个数,序列不重要,允许重复的话,一共有{calResult}种组合。")
'''
#------------------------------------------------#
#计算组合,n!/[r!(n-r)!](序列不重要,不允许重复)
#方法一
numN,denR,denNsubR = 1,1,1
if n < 0:
    print("负数无法阶乘!")
elif n == 0:
    print("0的阶乘为1!")
else:
    for i in range(1,n+1):
        numN *= i
    for i in range(1,r+1):
        denR *= i
    for i in range(1,(n-r)+1):
        denNsubR *= i
calResult = int(numN / (denR * denNsubR))
print(f"{n}个数,序列不重要,不允许重复的话,一共有{calResult}种组合。")
#方法二
'''
import mathfactN       = math.factorial(n)
factR       = math.factorial(r)
factNsubR   = math.factorial(n-r)
calResult   = int(factN / (factR * factNsubR))
print(f"{n}个数,序列不重要,不允许重复的话,一共有{calResult}种组合。")
'''

【结果】

1.png


回复列表



回复操作

正在加载验证码......

请先拖动验证码到相应位置

发布时间:2020-11-11 15:46:43

修改时间:2020-11-11 15:50:54

查看次数:31

评论次数:0