在python中大量的LCM

时间:2016-08-20 11:04:26

标签: python python-3.x math greatest-common-divisor lcm

我使用公式"两个数字的乘积等于他们的GCD和LCM的乘积"。

这是我的代码:

{{1}}

它适用于小数字。但是当我提供输入时:

  

输入:   226553150 1023473145

     

我的输出:   46374212988031352

     

正确输出:   46374212988031350

任何人都可以告诉我哪里出错了?

1 个答案:

答案 0 :(得分:3)

阐述评论。在Python 3中,真正的除法/将其参数转换为浮点数。在您的示例中,lcm(226553150, 1023473145)的真实答案是46374212988031350。通过查看bin(46374212988031350),您可以验证这是一个56位数字。当您计算226553150*1023473145/5(5是gcd)时,您会得到4.637421298803135e+16。文档表明这种浮点数只有53位的精度。从53< 56,你丢失了信息。使用//可以避免这种情况。有点违反直觉,在这种情况下,它是“真正的”分裂,实际上是错误的。

顺便说一句,在处理涉及大整数的精确计算时,一个有用的模块是fractions(*):

from fractions import gcd
def lcm(a,b):
    return a*b // gcd(a,b)

>>> lcm(226553150,1023473145)
46374212988031350

(*)我刚注意到fractions上的文档说明了它的gcd:“从版本3.5开始不推荐使用:使用math.gcd()代替”,但我决定保留引用至fractions,因为了解它并且您可能使用3.5之前的版本仍然很好。