友好数函数出现异常

-1 投票
1 回答
506 浏览
提问于 2025-04-17 16:45

这个函数是我在尝试解决Project Euler的第21题要求计算所有小于10000的友好数的总和。我使用了一个模块,叫做list_divisors(),这个模块我在另一个文件里写的,应该是没问题的。它应该不会影响到出错的地方。

def ami():
    storedSums = [0, 0]
    amiables = [0, 0]
    for i in range(2, 10000):
        som = sum(k for k in list_divisors(i))
        storedSums.append(som) if som < 10000 else 0
        for j in range(2, i - 1):

            #this if statement is the test.  It does not do anything except print what is happening.
            if (i > 5037 and j % 1000 == 0) or i < 10 or (i > 5038 and j > 5020):
                print("i = {}, j = {}, storedSums[i] = {}, storedSums[j] = {}, \
                len(storedSum) = {}".format(i, j, storedSums[i], storedSums[j], len(storedSums)))

            #The code freezes here at 5040
            if storedSums[i] == j and storedSums[j] == i:
                amiables.extend((i, j))
    return sum(i for i in amiables)

print(ami())

这是我测试的输出结果:

i = 4, j = 2, storedSums[i] = 3, storedSums[j] = 3, len(storedSum) = 5
i = 5, j = 2, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 6
i = 5, j = 3, storedSums[i] = 6, storedSums[j] = 4, len(storedSum) = 6
i = 6, j = 2, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 7
i = 6, j = 3, storedSums[i] = 6, storedSums[j] = 4, len(storedSum) = 7
i = 6, j = 4, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 7
i = 7, j = 2, storedSums[i] = 8, storedSums[j] = 3, len(storedSum) = 8
i = 7, j = 3, storedSums[i] = 8, storedSums[j] = 4, len(storedSum) = 8
i = 7, j = 4, storedSums[i] = 8, storedSums[j] = 3, len(storedSum) = 8
i = 7, j = 5, storedSums[i] = 8, storedSums[j] = 6, len(storedSum) = 8
i = 8, j = 2, storedSums[i] = 11, storedSums[j] = 3, len(storedSum) = 9
i = 8, j = 3, storedSums[i] = 11, storedSums[j] = 4, len(storedSum) = 9
i = 8, j = 4, storedSums[i] = 11, storedSums[j] = 3, len(storedSum) = 9
i = 8, j = 5, storedSums[i] = 11, storedSums[j] = 6, len(storedSum) = 9
i = 8, j = 6, storedSums[i] = 11, storedSums[j] = 6, len(storedSum) = 9
i = 9, j = 2, storedSums[i] = 4, storedSums[j] = 3, len(storedSum) = 10
i = 9, j = 3, storedSums[i] = 4, storedSums[j] = 4, len(storedSum) = 10
i = 9, j = 4, storedSums[i] = 4, storedSums[j] = 3, len(storedSum) = 10
i = 9, j = 5, storedSums[i] = 4, storedSums[j] = 6, len(storedSum) = 10
i = 9, j = 6, storedSums[i] = 4, storedSums[j] = 6, len(storedSum) = 10
i = 9, j = 7, storedSums[i] = 4, storedSums[j] = 8, len(storedSum) = 10
i = 5038, j = 1000, storedSums[i] = 5052, storedSums[j] = 1140, len(storedSum) = 5039
i = 5038, j = 2000, storedSums[i] = 5052, storedSums[j] = 2236, len(storedSum) = 5039
i = 5038, j = 3000, storedSums[i] = 5052, storedSums[j] = 3860, len(storedSum) = 5039
i = 5038, j = 4000, storedSums[i] = 5052, storedSums[j] = 4268, len(storedSum) = 5039
i = 5038, j = 5000, storedSums[i] = 5052, storedSums[j] = 5140, len(storedSum) = 5039
i = 5039, j = 1000, storedSums[i] = 5040, storedSums[j] = 1140, len(storedSum) = 5040
i = 5039, j = 2000, storedSums[i] = 5040, storedSums[j] = 2236, len(storedSum) = 5040
i = 5039, j = 3000, storedSums[i] = 5040, storedSums[j] = 3860, len(storedSum) = 5040
i = 5039, j = 4000, storedSums[i] = 5040, storedSums[j] = 4268, len(storedSum) = 5040
i = 5039, j = 5000, storedSums[i] = 5040, storedSums[j] = 5140, len(storedSum) = 5040
i = 5039, j = 5021, storedSums[i] = 5040, storedSums[j] = 5022, len(storedSum) = 5040
i = 5039, j = 5022, storedSums[i] = 5040, storedSums[j] = 5110, len(storedSum) = 5040
i = 5039, j = 5023, storedSums[i] = 5040, storedSums[j] = 5024, len(storedSum) = 5040
i = 5039, j = 5024, storedSums[i] = 5040, storedSums[j] = 5071, len(storedSum) = 5040
i = 5039, j = 5025, storedSums[i] = 5040, storedSums[j] = 166, len(storedSum) = 5040
i = 5039, j = 5026, storedSums[i] = 5040, storedSums[j] = 5036, len(storedSum) = 5040
i = 5039, j = 5027, storedSums[i] = 5040, storedSums[j] = 5039, len(storedSum) = 5040
i = 5039, j = 5028, storedSums[i] = 5040, storedSums[j] = 5040, len(storedSum) = 5040
i = 5039, j = 5029, storedSums[i] = 5040, storedSums[j] = 5077, len(storedSum) = 5040
i = 5039, j = 5030, storedSums[i] = 5040, storedSums[j] = 5038, len(storedSum) = 5040
i = 5039, j = 5031, storedSums[i] = 5040, storedSums[j] = 5091, len(storedSum) = 5040
i = 5039, j = 5032, storedSums[i] = 5040, storedSums[j] = 5101, len(storedSum) = 5040
i = 5039, j = 5033, storedSums[i] = 5040, storedSums[j] = 5041, len(storedSum) = 5040
i = 5039, j = 5034, storedSums[i] = 5040, storedSums[j] = 5040, len(storedSum) = 5040
i = 5039, j = 5035, storedSums[i] = 5040, storedSums[j] = 5113, len(storedSum) = 5040
i = 5039, j = 5036, storedSums[i] = 5040, storedSums[j] = 5039, len(storedSum) = 5040
i = 5039, j = 5037, storedSums[i] = 5040, storedSums[j] = 5064, len(storedSum) = 5040
Traceback (most recent call last):
  File "<string>", line 420, in run_nodebug
  File "F:\Programming\python\project euler\Amicable numbers.py", line 18, in <module>
    print(ami())
  File "F:\Programming\python\project euler\Amicable numbers.py", line 14, in ami
    if storedSums[i] == j and storedSums[j] == i:
IndexError: list index out of range

出现“索引超出范围”的错误是因为在尝试访问storedSums[i]时,当i变成5040时发生了错误。

1 个回答

3

我觉得问题出在这里:

storedSums.append(som) if som < 10000 else 0

这段代码只有在 som 小于 10000 的时候才会往列表里添加东西,否则就什么都不做。所以你对索引长度的假设是不对的。

看看这个测试程序:

test_list = []
for i in range(10):
    test_list.append(i) if i < 5 else 0
print test_list

输出结果是:

[0, 1, 2, 3, 4]

我觉得你想要的是这个:

    if som < 10000:
        storedSums.append(som)
    else:
        storedSums.append(0)

撰写回答