CS50 python Credit 不适用于 AMEX,但可用于其他卡

CS50 python Credit not working for AMEX, working fine with other cards

from cs50 import get_int, get_string


#Asking User For Credit Card Number
def main():
    while True:
        Credit_Card = str(get_int("Enter Credit Card Number: "))
        if Credit_Card !=  "":
            break
        
    cardCheck(cardSum, Credit_Card)

def cardSum(Credit_Card):
    even = 0
    odd = 0


    CC = len(Credit_Card)

    if (CC == 0):
        return 0

    else:
        if (CC % 2 == 0):
            last = int(Credit_Card[-1])
            even += last
            
            return even + cardSum(Credit_Card[:-1])

        else:
            last = int(Credit_Card[-1])
            last = last * 2
            oddDigits = last // 10 + last % 10
            odd += oddDigits
            
            return odd + cardSum(Credit_Card[:-1])

#Checking is card valid or not
def cardCheck(cardSum,Credit_Card):
    Total = cardSum(Credit_Card)

    if (Total % 10 == 0):

        if (len(Credit_Card) == 15) and (int(Credit_Card[0:2]) in [37, 34]):
            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__":
    main()

我想不通为什么我的程序没有用这些 AMEX 卡 Number:378282246310005 , 371449635398431 给出正确的输出 在我的 C 实现的信用中,这两张卡显示 AMEX 但在 python 它显示 INVALID 作为输出 Master,Visa

工作正常

我认为问题在于您的代码使用的是 absolute 奇偶校验而不是 relative 奇偶校验。也就是说,我们从右边的倒数第二个数字开始加倍,然后每隔一个数字向左移动。但是要加倍的数字的指标的奇偶性取决于原始数字的位数是奇数还是偶数。您的代码没有考虑到这一点。

我们需要在开始时计算卡片的奇偶校验,并将此奇偶校验传递给递归 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 提出的,因为它是一个奇数长度的数字 -- 您是否测试过任何其他发卡机构的奇数长度数字?