Python 大量的错误?

Python innacuracies with large numbers?

我必须编写一个使用另一个函数的函数,但另一个函数必须 return 整数,这对于大数来说相当不准确。

我的代码:

import math

def reduce(n, d):
    m = min(n, d)
    for i in range(m, 1, -1):
        if n%i==0 and d%i==0:
            n = n//i
            d = d//i
    return (n, d)

def almost_square(n, d):
    f = n/d
    c = math.ceil(f)
    n*=c
    return reduce(n, d)

def destiny(n, d):
    b = n/d
    fraction = n, d
    while not b.is_integer():
        breuk = almost_square(fraction[0], fraction[1])
        b = fraction[0]/fraction[1]
    
    return int(b)

函数应该做什么:

reduce: 只是简化分数,例如 2/4 变成 1/2

almost_square:将分数乘以分数的四舍五入整数

命运:对一个分数应用几乎平方,直到它 return 成为一个整数。

事实是,我的 uni 使用一个程序,该程序为每个函数尝试 50 个测试用例,而您仅在每个函数都适用于所有 50 个测试用例时才完成练习,并且他们期望函数 'reduce' return 一个整数元组,但是使那里的数字成为整数会使我的函数 'destiny' 不准确,或者至少我是这么认为的。

所以在 50 个测试用例中,所有 50 个都在函数 reduce 上工作,所有 50 个都在函数 almost_square 上工作,但是 5 个在函数 destination 上失败,它们是:

destiny(10, 6),我的输出:1484710602474311424,预期输出:1484710602474311520 destiny(17, 13),我的输出:59832260230817688435680083968,预期输出:59832260230817687634146563200

destiny(10, 3),我的输出:1484710602474311424,预期输出:1484710602474311520 命运(15、9),我的输出:1484710602474311424,预期输出:1484710602474311520 destiny(11, 5),我的输出:494764640798827343035498496,预期输出:494764640798827359861461484

有什么可以解决这个问题的吗?

整数不会因为大数字而变得不准确。浮点数可以。而你使用的是浮点数。

重写您的算法以仅使用整数。

该代码中有一些浮点运算,可能会稍微偏离结果,显然确实如此。忘记浮点数,也不要使用任何“浮点数,但更大的”库,整数运算是可行的方法。

例如,

f = n/d
c = math.ceil(f)
n*=c

这段代码看起来像是在计算 n * ⌈n / d⌉,但它只是 近似地 计算,因为它使用浮点运算,需要将值四舍五入到最接近的浮点数 (例如,int(float(1484710602474311520)) 是 1484710602474311424)。它应该使用整数运算来实现,例如像这样:

n *= (n + d - 1) // d

destiny函数也不应该使用浮点除法,也不需要。 “b 是一个整数”测试可以等效地表述为“dn”吗,这可以用整数运算来实现。

另外,对于那个 reduce 函数,您可以使用 math.gcd,或者自己实现 gcd,您现在的实现速度很慢。

通过这些更改,我得到了您提到的测试用例的正确结果。我可以展示代码,但由于这是一项作业,您可能应该自己编写代码。问这个问题已经很冒险了。