我使用公式"两个数字的乘积等于他们的GCD和LCM的乘积"。
这是我的代码:
{{1}}
它适用于小数字。但是当我提供输入时:
输入: 226553150 1023473145
我的输出: 46374212988031352
正确输出: 46374212988031350
任何人都可以告诉我哪里出错了?
答案 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之前的版本仍然很好。