代码:
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
发生了什么事,我该怎么办呢?
提前谢谢。
答案 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