2017-02-27 95 views
0

我很抱歉,如果我没有正确标题,但我无法获得下面的代码执行。 for循环参数似乎至少是问题的一部分。如果我在for循环中将“limit”替换为“num”以产生“对于范围(1,limit)中的j”,循环会执行并提供所需的输出。但是用num而不是限制,我应该能够更精确地控制循环的迭代,但它不会完成但不会出现错误。Python:循环参数

from collections import Counter 

limit = int(input('What number do you want to factor?')) 
num = limit 
factors = [] 
while num != 1: 
    for j in range(2, num):   
     if (num % j == 0): 
      num = num // j 
      factors.append(j) 
      break 

factorEnum = Counter(factors) 

print(factors) 
print(factorEnum) 

该代码的目的是产生给定数字的素数分解。例如,对于数字28,素数因子是{2,7},但我正在寻找素数分解,这将是{2,2,7}。此代码是查找一系列数字的最小公倍数的其他脚本的一部分(例如,1 - 40)。这是ProjectEuler的一个问题。

+0

'if(num%j == 0):'when that is not True,you do not'num'' then you run runs forever。假设'num'是2,那么'对于范围(2,num)中的j'不运行,num不会减少并且发生相同的事情。 – tdelaney

+0

添加一些打印件,你会看到它出错的地方。更好的是,在'pdb3'调试器中运行它。 – tdelaney

+0

@tdelaney只有在某些时候'j'的值不等于'num'时,情况才会如此。即使数字是素数,它仍然会循环,直到'j == num'和'num'将被设置为'num'//'j',这将是1.然后break语句退出for循环, 'num'为1的值退出while循环。 ... 我认为。 – KhromRol

回答

0

查看上面tdelaney的评论。这几乎解决了我的问题。

由于'范围'功能不包括端点,所以for循环永远不会退出。对于任何数字都是如此。但是使用'limit'扩展了for循环的范围,除了素数之外的所有数字都超出了'num'的值。因此,除非数字是素数,否则“限制”是有效的。

我将代码更改为'num + 1'作为第二个参数,并且工作正常。

谢谢@tdelaney。