1 回答
TA贡献1876条经验 获得超6个赞
我认为问题在于您的代码使用的是绝对奇偶校验而不是相对奇偶校验。也就是说,我们从右边的倒数第二个数字开始加倍,然后每隔一个数字向左移动。但是要加倍的数字的指标的奇偶性取决于原始数字的位数是奇数还是偶数。您的代码没有考虑到这一点。
我们需要在开始时计算卡片的奇偶校验,并通过递归cardSum()调用传递这个奇偶校验,所以它会加倍正确的数字:
def cardSum(digits, parity):
if not digits:
return 0
digit, digits = int(digits[-1]), digits[:-1]
if len(digits) % 2 == parity:
digit *= 2
digit = digit // 10 + digit % 10
return digit + cardSum(digits, parity)
def cardCheck(cardSum, credit_card):
checksum = cardSum(credit_card, len(credit_card) % 2)
if checksum % 10 == 0:
if len(credit_card) == 15 and int(credit_card[0:2]) in [34, 37]:
print("AMEX")
elif len(credit_card) == 16 and int(credit_card[:2]) in range(50, 56):
print("MASTER CARD")
elif len(credit_card) in [13, 16] and int(credit_card[:1]) == 4:
print("VISA")
else:
print("INVALID")
else:
print("INVALID")
if __name__ == "__main__":
credit_card = input("Enter Credit Card Number: ")
if credit_card != "":
cardCheck(cardSum, credit_card)
我猜这是 AMEX 提出来的,因为它是一个奇数长度的数字——您是否测试过任何其他发卡机构的奇数长度数字?
添加回答
举报