CS50 python信用卡不适用于美国运通,适用于其他卡

2024-10-02 16:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

我无法理解为什么我的程序不能正确输出这些美国运通卡号:37828224631005371449635398431在我的C实现的信用卡中,这两张卡显示的是美国运通 但在python中,它显示为无效的输出 这对大师来说很好,维萨


Tags: getlenifmaindefcardelseint
1条回答
网友
1楼 · 发布于 2024-10-02 16:26:12

我认为问题在于您的代码使用了绝对奇偶校验,而不是相对奇偶校验。也就是说,我们从右边第二个到最后一个数字开始加倍,然后每隔一个数字向左。但两位数的符号奇偶性取决于原始数字的位数是奇数还是偶数。你的代码不能解释这一点

我们需要在开始时计算卡的奇偶校验,并通过递归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)

我猜这是美国运通推出的,因为它是一个奇数长度的数字。你测试过其他发卡行的奇数长度数字吗

相关问题 更多 >