我遇到了一个问题,在A和B中输入了一个函数。这些是从1,1开始的目标数字,其中B只能增加A而A只能增加B(Ex,1 1 - > 2 1或1 2. 2 1 - > 3 1或2 3. 2 3 - > 5 3或2 5)。这会创建一个二叉树。在问题中,给定目标数字,我需要找到已达到该数字的“最小”代数,或者是否有可能达到的数目(例如,无法达到2 4)。这是我提出的解决方案,它正在通过我抛出的每个测试用例:
import math
def answer(M, F):
m = int(M)
f = int(F)
numgen=0
if f==1 and m==1:
return "0"
while f>=1 and m>=1:
if f > m:
m, f = f, m
if f==1:
return str( numgen + m - 1 )
if m>f:
numgen += math.floor( m / f )
m = m % f
return "impossible"
我是半码打高尔夫球的,我觉得我的解决方案非常优雅且效率很高。我在十代内投入的所有东西都是正确的,如果我扔大号(输入上限为10 ^ 50),那些工作也很好。当提交并针对未知的测试用例运行时,五个中的三个失败。从本质上讲,我的问题是更想知道这里的哪些案例失败了。
我有一些我无法证明的假设,但相当确定是准确的:
这个解决方案在哪里错了?
答案 0 :(得分:2)
你没有说你是否使用Python 2或Python 3,但math.floor( m / f )
只在Python 3中有意义。m / f
是一个浮点数,它是不精确。您最好简单地使用整数除法:numgen += m // f
。重要的一个示例是M, F = str(10**30), '3'
,您可以在其中计算333333333333333316505293553666
但使用整数除法可以获得333333333333333333333333333335
。
答案 1 :(得分:1)
你的解决方案太复杂了我的诚实意见。看看这个:
def answer(M, F):
my_bombs = [int(M), int(F)]
my_bombs.sort()
generations = 0
while my_bombs != [1, 1]:
if my_bombs[0] == 1:
return str(generations + my_bombs[1] - 1)
if my_bombs[0] < 1 or my_bombs[0] == my_bombs[1]:
return "impossible"
print(my_bombs, generations)
n = my_bombs[1] // my_bombs[0]
my_bombs[1] -= my_bombs[0] * n
generations += n
my_bombs.sort()
return str(generations)