Python中奇怪的循环行为

Python中奇怪的循环行为,python,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):

守则:

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 
这个代码应该生成友好的数字。除数总数小于其自身等于另一个数的数,即除数总数等于原始数,请参见下面的10000,并在找到它们时将其相加。它产生了48,这太低了

程序运行的速度比我预期的要快得多:我正在运行大量的数字,我知道这不是一种很快获得正确除数的方法,所以我怀疑循环出了问题,要么是Python突然停止,要么是循环运行出了问题。如果我在下一个循环开始之前输入一个命令来打印除数,它将永远持续下去,并且倾向于打印相同数字的长行。这里肯定发生了奇怪的事情。我在谷歌上搜索了奇怪的循环行为,在这里搜索,但没有结果。我也查过了

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

先谢谢你

xrange(1, n)
给你从1。。。n-1。要从1获取数字。。。n、 您需要执行xrange1,n+1。您在代码中犯了两次这个错误

您也没有检查有关!=b在原来的问题中

给你从1。。。n-1。要从1获取数字。。。n、 您需要执行xrange1,n+1。您在代码中犯了两次这个错误

您也没有检查有关!=b在原始问题中。

这里有几个问题:

应该是

total = total + number
范围1,x只运行到x-1。因此,您需要在此处指定range1,n/2+1一些问题:

应该是

total = total + number

范围1,x只运行到x-1。因此,您需要指定range1,n/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

你的算法坏了。让我们以示例中给出的友好数字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

除数和除数2应该是数字还是序列?它们是总数。只是常规的旧整数。等到最后再把所有友好的数字相加可能会有帮助。这样你就可以检查并打印列表,看看你得到的是什么类型的数字。此外,问题21并不要求友好数字的总数,而是要求10000以下所有友好数字的总和。除数和除数2应该是数字还是序列?它们是总数。只是常规的旧整数。等到最后再把所有友好的数字相加可能会有帮助。这样你就可以检查并打印列表,看看你得到的是什么类型的数字。另外,问题21不要求友好数字的总数,它要求10000以下所有友好数字的总和。修复了问题。我以为我已经修好了。比你强。为什么我要检查这种情况?让我们看28。它的因子1,2,4,7,14之和是28。结果的因子之和当然又是28。但是28,28不是友好的一对,因为这两个数字必须不同。换句话说,您需要确保数字和除数不相等,但数字和除数2相等。此外,将数字+除数添加到总数中,就是重复计算。当number和除数在循环的下一次迭代中交换值时,您将再次添加此对,除非number==除数,但这些情况无论如何都不需要计数。您可以将这部分代码更改为total=total+number.Ah。我不确定。这个问题很模糊。我预料到了这个问题,这是一个简单的解决方法:total\2。解决了这个问题。我以为我已经修好了。比你强。为什么我要检查这种情况?让我们看28。它的因子1,2,4,7,14之和是28。结果的因子之和当然又是28。但是28,28不是友好的一对,因为这两个数字必须不同。换句话说,您需要确保数字和除数不相等,但数字和除数2相等。此外,将数字+除数添加到总数中,就是重复计算。当number和除数在循环的下一次迭代中交换值时,您将再次添加此对,除非number==除数,但这些情况无论如何都不需要计数。您可以将这部分代码更改为total=total+number.Ah。我不确定。这个问题很模糊。我预料到了这个问题,这是一个简单的解决方法:total\2。非常全面。非常感谢,非常全面。非常感谢你。