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
是一个整数”测试可以等效地表述为“d
除 n
”吗,这可以用整数运算来实现。
另外,对于那个 reduce
函数,您可以使用 math.gcd
,或者自己实现 gcd
,您现在的实现速度很慢。
通过这些更改,我得到了您提到的测试用例的正确结果。我可以展示代码,但由于这是一项作业,您可能应该自己编写代码。问这个问题已经很冒险了。
我必须编写一个使用另一个函数的函数,但另一个函数必须 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
是一个整数”测试可以等效地表述为“d
除 n
”吗,这可以用整数运算来实现。
另外,对于那个 reduce
函数,您可以使用 math.gcd
,或者自己实现 gcd
,您现在的实现速度很慢。
通过这些更改,我得到了您提到的测试用例的正确结果。我可以展示代码,但由于这是一项作业,您可能应该自己编写代码。问这个问题已经很冒险了。