2017-04-22 44 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