为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2023-05-09 09:50:19
from cs50 import get_int, get_string#Asking User For Credit Card Numberdef 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 notdef 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
查看完整描述

1 回答

?
HUX布斯

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 提出来的,因为它是一个奇数长度的数字——您是否测试过任何其他发卡机构的奇数长度数字?


查看完整回答
反对 回复 2023-05-09
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信