计算组合数C(n,i)时避免浮点数精度影响结果的解决方法

def c1 (n,i):
    minNI = min(i,n-1)
    result = 1
    for j in range (0,minNI):
        result = result * (n-j)/(minNI-j)
    return result
print ('更改前C(5,3)数值为:',c1(5,3))
print ('更改前C(100,97)数值为:',c1(100,97))
print ('更改前C(100,3)数值为:',c1(100,3))
#例如更改为//后C(5,2)的结果便不等于10
def c2 (n,i):
    minNI = min(i,n-1)
    result = 1
    for j in range (0,minNI):
        result = result * (n-j)//(minNI-j)#//取的是最小整数,/得到的是实际结果,然而如改为//会产生更大的误差,
    return result
print ('更改//后C(5,3)数值为:',c1(5,3))
print ('更改//后(100,97)数值为:',c2(100,97))
print ('更改//后(100,3)数值为:',c2(100,3))
#根据数学组合公式应写为如下方式:
def jc(a):
    a1 = a
    for b in range(1, a):
        a1 = a1 * (a - b)
    return a1
def cni(n,i):
    if(n<i):
        print("输入错误!n应大于i")
        return 0
    else:
     result = jc(n)//(jc(i)*jc(n-i))#此时利用//仅取整一次,可以降低很多误差
     return result
print ('更改算法和//后C(5,3)数值为:',cni(5,3))
print ('更改算法和//后C(100,97)数值为:',cni(100,97))
print ('更改前算法和//C(100,3)数值为:',cni(100,3))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cola_Dream

大学生在线乞讨(滑稽)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值