试图计算校验和但最终陷入无限循环 - 请解释一下?
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:
我正在尝试根据给定的卡号计算校验和。我知道有很多现成的性能更好的算法。我想知道的是为什么我会陷入无限循环我就是不明白。
'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: