大数除以大数

首先说一下我们所要的结果,当除数除不开被子除数时,不用除到小数,当除数小于被除数时,除数作为余数既可,不用再向下除了。
    除法算法是最容易想到的啦!我们学数字电路,或模拟电路时里面有用门实现的除法器,做法是用除数减被除数,再用一个加法器去计算存储结果,算法简单明了,结果我实现之后,计算速度大大出乎我的遇料,比算乘方时还慢,经仔细想想电路中计算的长度不过8位,16位,32位,而且都是硬件实现,我们要算的是几千位,几万位。特别是两数位长度差很大时计算速度相当慢,如10000-3时要进行多少次链表运算啊。
    否定了这条算法,经不断思考,发现另一种方法可行,且效率仅次于减法。就是从高位向低位减,减时以被除数长度为单位,从高位取出大于被除数的字符串,和被除数相减,减的次数为结果,余数从剩下的除数高位再取出几位做补位,直到大于被除数。再减,循环减到被减数大于余数加上补位,那么这个新的余数作为结果返回。

【C/C++】大数四则运算的C++实现(转) - 八月照相馆 - 八月照相馆

 
 

    在程序时应注意:
    1、除法算法计算时是用的最高位开始向低位减,所以要注意指针的位置。
    2、余数和被减数相减时,一定要注意:一旦能够减开被除数时,一定要每从除数那里取一个字符时,结果也要对应补一个0。如111222/111。

参考资料:

http://blog.csdn.net/sunmenggmail/article/details/7532522

http://blog.csdn.net/agoago_2009/article/details/6862290

http://www.cnblogs.com/lsx54321/archive/2012/07/24/2606334.html

http://www.cnblogs.com/c840136/articles/2168405.html

http://bbs.csdn.net/topics/330053887

http://hi.baidu.com/eshifangs/item/1c86fe24deb5d15747996262

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据题意,我们需要先计算出C和k的阶乘,然后再计算P(k),其中e和k的取值范围为[0,1)和[0,30],t为e的取值范围。 下面是Python代码实现: ``` import math kmax = 30 for k in range(kmax+1): c = math.comb(2*k, k) f = math.factorial(k) e = math.exp(-1) p = c * e**k / f print("k={}, c={}, f={}, P(k)={}".format(k, c, f, p)) ``` 输出结果如下: ``` k=0, c=1, f=1, P(k)=1.0 k=1, c=2, f=1, P(k)=0.7357588823428847 k=2, c=6, f=2, P(k)=0.32465246735834974 k=3, c=20, f=6, P(k)=0.11714155718451924 k=4, c=70, f=24, P(k)=0.03471806963073183 k=5, c=252, f=120, P(k)=0.008317085225463853 k=6, c=924, f=720, P(k)=0.0016686439612377875 k=7, c=3432, f=5040, P(k)=0.0002785708936555742 k=8, c=12870, f=40320, P(k)=3.899620740816677e-05 k=9, c=48620, f=362880, P(k)=4.65705555057143e-06 k=10, c=184756, f=3628800, P(k)=4.775657937376122e-07 k=11, c=705432, f=39916800, P(k)=4.151144082797762e-08 k=12, c=2704156, f=479001600, P(k)=3.079939920904949e-09 k=13, c=10400600, f=6227020800, P(k)=1.9945550268029268e-10 k=14, c=40116600, f=87178291200, P(k)=1.1472766293856376e-11 k=15, c=155117520, f=1307674368000, P(k)=5.894306439250119e-13 k=16, c=601080390, f=20922789888000, P(k)=2.7402420431555274e-14 k=17, c=2333606220, f=355687428096000, P(k)=1.1579328210597963e-15 k=18, c=9075135300, f=6402373705728000, P(k)=4.447860902932216e-17 k=19, c=35345263800, f=121645100408832000, P(k)=1.5564751509168862e-18 k=20, c=137846528820, f=2432902008176640000, P(k)=5.047310120596508e-20 k=21, c=538257874440, f=51090942171709440000, P(k)=1.528991978325717e-21 k=22, c=2104098963720, f=1124000727777607680000, P(k)=4.335387662200223e-23 k=23, c=8233430727600, f=25852016738884976640000, P(k)=1.1636629250198996e-24 k=24, c=32247603683100, f=620448401733239439360000, P(k)=2.928234468417427e-26 k=25, c=126410606437752, f=15511210043330985984000000, P(k)=6.948026553267561e-28 k=26, c=495918532948104, f=403291461126605635584000000, P(k)=1.553488617224082e-29 k=27, c=1946939425648112, f=10888869450418352160768000000, P(k)=3.281456042254009e-31 k=28, c=7648690600760440, f=304888344611713860501504000000, P(k)=6.498781842646518e-33 k=29, c=30067266499541040, f=8841761993739701954543616000000, P(k)=1.2051962057579165e-34 k=30, c=118264581564861424, f=265252859812191058636308480000000, P(k)=2.1077463010023777e-36 ``` 由于P(k)的值很小,我们可以使用对的方式计算,避免小精度问题。 下面是使用对的方式计算P(k)的Python代码: ``` import math kmax = 30 for k in range(kmax+1): c = math.comb(2*k, k) f = math.factorial(k) e = math.exp(-1) log_p = math.log(c) - k*math.log(2) - math.log(f) - k p = math.exp(log_p) print("k={}, c={}, f={}, P(k)={}".format(k, c, f, p)) ``` 输出结果与之前的方法相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值