组合数计算出现浮点误差的问题python

#首先组合数公式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


 

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值