python代码在计算大整数的最小公倍数时显示错误的输出

时间:2018-01-14 09:29:32

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

我在python中使用以下算法实现了lcm问题。 我的代码如下:

# Uses python3
import sys

def gcd_efficient(a, b):
    #current_gcd = 1
    #for d in range(2, min(a, b) + 1):
    #   if a % d == 0 and b % d == 0:
    #        if d > current_gcd:
    #            current_gcd = d

    #return current_gcd

    remainder = max(a, b) % min(a, b)
    newMax = min(a, b)
    if remainder == 0:
        return newMax

    return  gcd_efficient(newMax, remainder)


def lcm_efficient(a, b):
    #for l in range(1, a*b + 1):
    #   if l % a == 0 and l % b == 0:
    #        return l

    product = a*b
    gcd = gcd_efficient(a, b)
    lcm = product/gcd
    return int(lcm)

print(lcm_efficient(226553150, 1023473145))

现在我已经使用上面的代码来计算作为输入的大整数的lcm。

但是我发现对于一些大整数: 例如,当输入是: 输入: 226553150 1023473145 python控制台的输出是:46374212988031352 但实际输出应为:46374212988031350

实际输出与给定输出的差别仅为2.然而,令我困惑的是,为什么python解释器在执行上述代码时会在输出中出错。

此错误可以取消吗?

等待答案!!

1 个答案:

答案 0 :(得分:0)

你的问题在这里:

lcm = product/gcd

应该是

lcm = product//gcd

保证整数除法。您从C ++的翻译假设/运算符在C ++和Python中的工作方式相同。在Python 2中它确实如此。但不是在Python 3中。在Python 3中,/调用浮点除法,因此原始版本要求将两个操作数转换为浮点数(在此过程中失去精度),然后浮点除法。您的return语句会将浮点结果转换回int,从而掩盖问题。