2017-04-22 69 views
0

所以我用一些所谓的拉马努金的数字工作。基本上我想要做的功能是这样的:得到错误输出(拉马努金)

  1. 输入来自用户的数量,并将其保存正
  2. 函数打印向量的两个条目(a,b),其中a^3+b^3=n列表。

例如,当I输入n = 443889,我应该得到的[(76,17),(38,73)]的输出,因为76^3 + 17^3 = 443889,和38^3 + 73^3 = 443889.

查看我的代码如下,当我输入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) 

回答

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)] 

并且只会返回'half'结果。

+0

太棒了,谢谢! – armara

+0

出于某种原因,您发布的第二个代码在n = 2000时不起作用。我应该得到输出[(10,10)],因为10^3 + 10^3 = 2000,但是我得到一个空列表。 – armara

+0

我试图改变到'小区(第(n **(1/3))',所以我除去'/ 2'部分,这使得它对于n = 2000,但它也使输出再次被加倍对于n = 1729 – armara