Python中的奇怪循环行为

时间:2012-10-26 21:41:58

标签: python

代码:

total = 0

for number in xrange(10000):
    divisors = 0
    divisors2 = 0

    for dividend in xrange(1, number/2):
        if number % dividend == 0:
            divisors = divisors + dividend

    for dividend2 in xrange(1, divisors/2):
        if divisors % dividend2 == 0:
            divisors2 = divisors2 + dividend2

    if number == divisors2:
        total = total + number + divisors

print total 

该代码应该生成友好数字(即除数总数小于其自身的数字等于除数的总数等于原始数字的数字,请参阅Project Euler, problem 21)10,000以下,并在找到时添加它们他们。它产生48,这太低了。

程序运行速度比我预期的要快得多:我正在运行很多数字,而且我知道这不是一个非常快速的方法来获得适当的除数,所以我怀疑是循环,要么是Python意外停止,要么是乱序运行循环。如果我在下一个循环开始之前输出一个命令来打印除数,它将永远持续下去,并且倾向于打印相同数字的长行。奇怪的是肯定会发生在这里。我搜索了“奇怪的循环行为”,并在这里搜索,但无济于事。我还检查了[这里]。2

发生了什么事,我该怎么办呢?

提前谢谢。

3 个答案:

答案 0 :(得分:3)

这里几个问题:

应该是

total = total + number

并且,范围(1,x)仅运行到x-1。因此,您需要指定范围(1,n / 2 + 1)

答案 1 :(得分:2)

xrange(1, n)

为您提供1 ... n-1的数字。要从1 ... n获取号码,您需要执行xrange(1, n+1)。你在代码中犯了这个错误两次。

您也没有检查原始问题中a != b的条件。

答案 2 :(得分:1)

你的算法坏了。让我们采用示例中给出的友好数字284,然后运行代码:

number = 284
divisors = divisors2 = 0

for dividend in range(1, number/2): #goes through all the numbers (1, 2, ..., 141)
    if not number % dividend: divisors += dividend 

#divisors = 78

for dividend2 in range(1, divisors/2): #goes through all the numbers (1, 2, ..., 38)
    if not divisors % dividend2: divisors2 += dividend2

#divisors2 = 51

if number == divisors2:
    #number != divisors2, because 284 != 51
    #the amicable number never gets added to your sum