CS50 python Credit 不适用于 AMEX,但可以与其他卡一起使用

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 卡号提供正确的输出:378282246310005,371449635398431在我的 C 实现的积分中,这两张卡显示 AMEX 但在 python 中它显示 INVALID 作为输出它工作正常对于 Master,Visa


慕斯709654
浏览 75回答 1
1回答

HUX布斯

我认为问题在于您的代码使用的是绝对奇偶校验而不是相对奇偶校验。也就是说,我们从右边的倒数第二个数字开始加倍,然后每隔一个数字向左移动。但是要加倍的数字的指标的奇偶性取决于原始数字的位数是奇数还是偶数。您的代码没有考虑到这一点。我们需要在开始时计算卡片的奇偶校验,并通过递归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 提出来的,因为它是一个奇数长度的数字——您是否测试过任何其他发卡机构的奇数长度数字?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python