将两个整数的乘积除以gcd的结果不正确

时间:2018-05-24 20:59:03

标签: python-3.x casting integer-division

我们知道两个数字'a'和'b';和&产品b等于GCD(a,b)和LCM(a,b)的乘积。

因此,为了找到两个数字的LCM,我在Python中编写了这个算法:

def gcd(a,b):

  if b==0:
     return a
  else:
     a_rem = a%b
     return gcd(b,a_rem)

print(int(a*b/(gcd(a,b)))

现在,在检查不同的测试用例时,我发现了这一点:

输入: 226553150 1023473145

我的输出: 46374212988031352

正确输出: 46374212988031350

我无法找出发生这种情况的原因,但由于某种原因,最后一位数字是错误的!

3 个答案:

答案 0 :(得分:0)

看起来你正在使用Python3。除法'/'执行浮点数计算并将结果作为浮点数返回,这对于大数字而言并不精确。这与你的gcd功能无关。如果你用更大的数字进行除法,你将会失去更多的精度数字。尝试int(12345678923456789123456789/1)

答案 1 :(得分:0)

在你的情况下,这是GCD每一步的输出

1023473145 226553150
226553150 117260545
117260545 109292605
109292605 7967940
7967940 5709385
5709385 2258555
2258555 1192275
1192275 1066280
1066280 125995
125995 58320
58320 9355
9355 2190
2190 595
595 405
405 190
190 25
25 15
15 10
10 5
5 0

,它将GCD设为5,用于分割a * b,并基本上将float转换为int,结果就是差异。

答案 2 :(得分:0)

为避免因整数到浮点转换而导致精度损失,请使用整数除法//而不是浮点除/

print(a*b//gcd(a,b))  # prints 46374212988031350

稍微优化:由于a和b中的每一个都是由它们的gcd除,所以在乘法之前除,所以整数的大小更小。

print(a*(b//gcd(a,b)))  # prints 46374212988031350

进一步优化:在Python 3.5 + gcd is built in中使用from math import gcd而不是自己实现它。