#首先组合数公式C(n,m)可以简单化简,例如C(8,5)=C(8,3)=(8*7*6)/(3*2*1),m或n-m为几,分式上下就有几
#个数。
def cni(n,i):#原函数
minNI = min (i,n-i)#C(8,5)->C(8,3),减少下面循环次数
result = 1
for j in range(0,minNI):
print('(',result,'*',n -j,')/', minNI-j) #调试
result =result*(n-j)/(minNI-j) #从最大项开始累乘
return result
def cni1(n,i):#改正后
minNI=min(i,n-i)
result = 1
for j in range(1, minNI+1):
print('(',result,'*',n -minNI+j,')/', j)#从最小项开始累乘
result = (result * (n -minNI+j)) /j#为了保证能够整除,先进行乘法后除
return result
print('原函数:')
print(cni(8,5),end='\n\n')
print('修改后:')
print(cni1(8,5))
output-----------------------------------------
原函数:
( 1 * 8 )/ 3
( 2.6666666666666665 * 7 )/ 2
( 9.333333333333332 * 6 )/ 1
55.99999999999999
修改后:
( 1 * 6 )/ 1
( 6.0 * 7 )/ 2
( 21.0 * 8 )/ 3
56.0
组合数计算出现浮点误差的问题python
猜你喜欢
转载自blog.csdn.net/qq_41033241/article/details/103384514
今日推荐
周排行