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 提出來的,因為它是一個奇數長度的數字——您是否測試過任何其他發卡機構的奇數長度數字?
添加回答
舉報