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
?
循环打印一对数字,范围从x
到y
,但当它达到y
值时,循环会打印一对反向数字,我不会这样做不需要它。
答案 0 :(得分:3)
break
命令将突破循环。所以这样的一行:
if (z == y):
break
应该做你想做的事。
答案 1 :(得分: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
表示"当y为真"时,任何值都将评估为真。
这会将您的计划缩减为以下内容:
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)
中的一个,这是可能的。但是,这与打破循环无关,但是当k
和z
彼此不相等时,您尝试执行的操作有两个有效值。第二个测试用例证明了这一点,其中(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
字符串的最佳做法是使用.format()
function,以便清楚显示您要打印的内容。