【问题标题】:Getting the wrong output (Ramanujan)得到错误的输出 (Ramanujan)
【发布时间】:2017-04-22 12:34:55
【问题描述】:

基本上我想要这个函数做的是:

  1. 取一个整数输入并保存为n
  2. 打印包含两个条目(a,b) 的向量列表,其中

例如,当我输入n = 443889时,我应该得到[(76,17),(38,73)]的输出,因为这个问题的唯一解决方案是:和

但是使用我的代码,当我给出输入 n=443889 时,我得到输出 [(76, 17), (75, 28), (74, 34), (73, 38), (72, 41)],即使其中一些向量没有给出我的方程的解。

def ramanujans(n):
    lista = []
    counter = 0

    for a in range(1,n):
        b = (n- (a**3))**(1/3)
        result = a**3 + b**3

        if isinstance(b,complex):
            break
        elif result == n:
            b = int(round(b))
            lista.insert(0,(a, b))

    return (lista)

【问题讨论】:

    标签: python-3.x math output equation


    【解决方案1】:

    对复杂结果的检查略有不同,如果result == n(仅限整数比较),我似乎得到了正确的结果:

    def ramanujans(n):
        res = []
    
        for a in range(1, n):
            s = n - a**3
            if s < 0:
                break
            b = round(s**(1/3))
            result = a**3 + b**3
    
            if result == n:
                res.append((a, b))
    
        return res
    

    与:

    [(17, 76), (38, 73), (73, 38), (76, 17)]
    

    作为n=443889 的结果

    你可以提前停止循环;如果a(n/2)**(1/3) 附近,您只需将ab 互换即可得到您已经拥有的结果;这可能看起来像(没有仔细检查边缘情况......):

    from math import ceil
    
    def ramanujans(n):
    
        res = []
    
        limit = ceil(((n/2)**(1/3)))
    
        for a in range(1, limit+1):
            s = n - a**3
            b = round(s**(1/3))
            result = a**3 + b**3
            if result == n:
                if a <= b:  # this is to cover the edge cases...
                    res.append((a, b))
        return res
    
    print(ramanujans(n=443889))  # [(17, 76), (38, 73)]
    print(ramanujans(n=2000))    # [(10, 10)]
    print(ramanujans(n=1729))    # [(1, 12), (9, 10)]
    

    并且只会返回“一半”的结果。

    【讨论】:

    • 由于某种原因,您发布的第二个代码不适用于 n=2000。我应该得到输出 [(10,10)],因为 10^3+10^3=2000,但我得到一个空列表。
    • 我尝试更改为ceil((n**(1/3)),所以我删除了/2-part。这使得它适用于 n = 2000,但它也使得输出在 n = 1729 时再次加倍。
    • 该死,我也尝试了 ceil(((n/2)**(1/3)+1 和 -1 和 +0,但我无法让它同时适用于 n=2000n=1729
    • 其实不需要预先计算limit;只要a&gt;b(严格)你就可以停下来了。
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多