2015-11-30 174 views
1
def sum_div(x, y): 
    for k in range(x,y+1): 
     for z in range(x,y+1): 
      sx = 0 
      sy = 0 
      for i in range(1, k+1): 
       if k % i == 0: 
        sx += i 
      for j in range(1, z+1): 
       if z % j == 0: 
        sy += j 
      if sx == sy and k!= z: 
       print "(", k ,",", z, ")" 

x = input("Dati x : ") 
y = input("Dati y : ") 
sum_div(x, y) 

如何停止的z == y的循環,如果價值?如何停止循環?

的循環打印一對數字的範圍從xy,但是當它擊中y值循環打印相反對,我並不需要它的數字。

+1

爲什麼你的for循環範圍具體包括y,你期望'while y''做什麼? – user2357112

+2

'如果z == y:break'? –

+0

行蹤和你想打破哪個循環? –

回答

1

你是什麼覺得你所要求的是break命令,但你實際上尋找的是去除重複的。

你的程序缺少一些清晰度。例如:

for i in range(1, k+1): 
    if k % i == 0: 
     sx += i 
for j in range(1, z+1): 
    if z % j == 0: 
     sy += j 

這兩件事情基本上做同樣的事情,它可以用list comprehension更乾淨寫入(在REPL):

>>> def get_divisors(r: int) -> list: 
...  return [i if r % i == 0 else 0 for i in range(1, r+1)] 
... 
... 
>>> get_divisors(4) 
>>> [1, 2, 0, 4] 

>>> sum(get_divisors(4)) 
>>> 7 

你行:

while y: 

...如果你找到一個匹配將會無限循環。你應該刪除它。 while y的意思是「while y is true」,其中的任何值都會評估爲true。

這將減少你的程序如下:

def get_divisors(r: int) -> list: 
    return [i if r % i == 0 else 0 for i in range(1, r+1)] 

def sum_div(x, y): 
    for k in range(x,y+1): 
     sum_of_x_divisors = sum(get_divisors(k)) # Note this is moved here to avoid repeating work. 
     for z in range(x,y+1): 
      sum_of_y_divisors = sum(get_divisors(z)) 
      if sum_of_x_divisors == sum_of_y_divisors and k!= z: 
       print("({},{})".format(k, z)) 

測試這個在REPL這似乎是正確的基於代碼的邏輯:

>>> sum_div(9,15) 
(14,15) 
(15,14) 
>>> sum_div(21, 35) 
(21,31) 
(31,21) 
(33,35) 
(35,33) 

但它可能是爲sum_div(9,15)你想只有一個(14,15)(15,14)。但是,這與打破循環無關,但當kz彼此不相等時,您嘗試執行的操作有兩個有效值。第二個測試用例說明了這一點,其中(33,35)是一個重複的值,但如果您打破(21,31)的for循環,則不會獲得第二組值。我們可以解釋這種

的方法之一是重新排序時,工作就完成了:

def sum_div(x, y): 
    result_set = set() # Sets cannot have duplicate values 
    for k in range(x,y+1): 
     sum_of_x_divisors = sum(get_divisors(k)) 
     for z in range(x,y+1): 
      sum_of_y_divisors = sum(get_divisors(z)) 
      if sum_of_x_divisors == sum_of_y_divisors and k!= z: 
       result_set.add(tuple(sorted((k,z)))) # compile the result set by sorting it and casting to a tuple, so duplicates are implicitly removed. 
    for k, z in result_set: # Print result set after it's been compiled 
     print("({},{})".format(k, z)) 

而且我們看到一個正確的結果:

>>> sum_div(9,15) 
(14,15) 
>>> sum_div(21,35) 
(21,31) 
(33,35) 

或者,您在留言中提供的測試案例。注意缺乏重複的:

>>> sum_div(10,25) 
(16,25) 
(14,15) 
(15,23) 
(10,17) 
(14,23) 

一些外賣:

  • 擺脫這一正在做同樣的事情功能,使您可以更輕鬆地推論它。
  • 以人類可讀的格式命名變量,以便我們,您的代碼的讀者(包括您)瞭解發生了什麼。
  • 不要使用循環,除非你實際上循環了一些東西。 for,while等只需要使用,如果你打算去檢查一系列事情。
  • 在提問時,一定要包括測試輸入,預期輸出和實際回收的內容。
  • print ing字符串的當前最佳做法是使用.format() function,以清楚地表明要打印的內容。
+0

感謝您的回答,但事情是我不需要反向的(14,15) (15,14)我得到了相同的輸出,我需要的是停止循環打印反向的... –

+0

查看我的更新。你不需要停止循環,你需要以某種方式忽略該值:'sum_div(21,35)'將停止循環*太快*如果你只是打破了...除非你只是試圖找到一個解決方案。這是*爲什麼*您需要提供輸入值和預期輸出:上面提出的問題不是您實際尋找的解決方案。 –

+0

@FrederickCastello再次更新了我的答案,以解決您的問題,這真的是一個積累,而不是循環中斷。 –

3

break命令將跳出循環。所以這樣的一條線:

if (z == y): 
    break 

應該做你想做的。

+0

不,我試過了,這不起作用... –

+0

這將取決於你放在哪裏它,因爲它只會打破最內層循環。 –

+0

迴路制動器可以打印的唯一地方是打印前「(」,k,「,」,z,「)」 –