【问题标题】:CS50 python Credit not working for AMEX, working fine with other cardsCS50 python Credit不适用于AMEX,与其他卡一起使用
【发布时间】:2020-11-29 00:31:27
【问题描述】:
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来说很好用

【问题讨论】:

  • 你能解释一下 cardSum 应该做什么吗?它应该只计算卡片数字的总和吗?

标签: python algorithm recursion cs50 luhn


【解决方案1】:

我认为问题在于您的代码使用了一种绝对 的奇偶感,而不是相对 一种。也就是说,我们从右边倒数第二个数字开始加倍,然后每隔一个数字向左加倍。但是要加倍的数字索引的奇偶性取决于原始数字是奇数位还是偶数位。您的代码没有考虑到这一点。

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

【讨论】:

  • 是的,我的代码不适用于奇数长度
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多