亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號