数学算法失败但似乎正确

时间:2016-09-20 15:03:58

标签: python algorithm math binary-tree primes

我遇到了一个问题,在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),那些工作也很好。当提交并针对未知的测试用例运行时,五个中的三个失败。从本质上讲,我的问题是更想知道这里的哪些案例失败了。

我有一些我无法证明的假设,但相当确定是准确的:

  • 二叉树中没有重复项。我没有发现任何案件,我怀疑它在数学上是可证明的。
  • 树的右半部分和左半部分可以在不影响世代数的情况下进行镜像 - 这个实际上已经证明了这一点。
  • 只有一条路线可以到达任何给定的组合(二元树的属性没有重复) - 这依赖于假设1,但如果假设1为真,那么这也必须为真。
  • 这两个数字中的一个始终是素数。这并没有真正影响算法,我还没有证明,但似乎总是如此。一个有趣的小窍。

这个解决方案在哪里错了?

2 个答案:

答案 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)