试图计算校验和但最终陷入无限循环 - 请解释一下?

Trying to calculate checksum but end up stuck in infinite loop - please explain?

我正在尝试根据给定的卡号计算校验和。我知道有很多现成的性能更好的算法。我想知道的是为什么我会陷入无限循环我就是不明白。

'numbers' 是字符串中的字符列表,例如 ("4000002345326738")

def get_checksum(numbers):
sum_ = 0
for n in numbers:
    x = int(n)
    sum_ += x
found = False
checksum = 0
while not found:
    if sum_ % 10 == 0:
        return checksum
    else:
        checksum += 1
        sum_ += checksum

让我们看看,每次迭代checksum加1,sum_增加checksum。这意味着在迭代次数 n 处,您的 sum_ 等于

sum_ = sum_initial + 1 + 2 + ... + n = sum_initial + n*(n+1)/2

您认为 sum_ 在某个时候可以被 10 整除。这是不正确的。 n(n+1)/2 模 10 的余数仅取决于 n % 20,因此很容易看出 n(n+1)/2 % 10 的可能值为:

0、1、3、6、5、8

因此,如果初始的 sum_ 是 1、3、6 或 8 模 10,则 sum_ 永远不会被 2 整除,并且您将陷入无限循环。

顺便说一句,因为 found 变量没有在任何地方使用,你可以只写 while True: