首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Luhns算法,mod 10校验

Luhns算法,mod 10校验
EN

Stack Overflow用户
提问于 2020-10-02 02:23:47
回答 1查看 316关注 0票数 0

我必须为我的课程计算思维做一个作业,但是当我输入这个有效的信用卡号码作为输入时,它总是说这个号码无效,有人知道为什么吗?

代码语言:javascript
复制
def ask_user():
string = (str(input("Please input your credit card number")))
numbers = list(map(int, string.split()))
if card_length(numbers):
    validation(numbers)
else:
    print("The credit card number you entered is invalid")

“此函数将信用卡号作为参数,并检查信用卡号的长度以查看其是否有效。”

代码语言:javascript
复制
def card_length(numbers):
for i in numbers:
    if 13 <= i <= 16:
        if numbers[0] == 4 or numbers[0] == 5 or numbers[0] == 6 or (numbers[0] == 3 and numbers[1] == 7):
            return True
else:
    return False

“此方法接受数字列表,并告诉用户它是否是与print语句的有效组合”

代码语言:javascript
复制
def validation(numbers):
odd_results = odd_digits(numbers)
even_results = even_digits(numbers)
sum_of_results = odd_results + even_results
if sum_of_results % 10 == 0:
    print("This credit card number is valid")
else:
    print("This credit card number is invalid")

“此函数将信用卡号作为字符串列表参数,并将其中的所有偶数位相加。”

代码语言:javascript
复制
def even_digits(numbers):
length = len(numbers)
sumEven = 0
for i in range(length - 2, -1, -2):
    num = eval(numbers[i])
    num = num * 2
    if num > 9:
        strNum = str(num)
        num = eval(strNum[0] + strNum[1])
        sumEven += num
    return sumEven

“此函数将信用卡号作为字符串列表参数,并将其中的所有奇数位相加。”

代码语言:javascript
复制
def odd_digits(numbers):
length = len(numbers)
sumOdd = 0
for i in range(length - 1, -1, -2):
    numbers += sumOdd
return sumOdd

“这是定义第一个名为ask_user的函数的主函数”

代码语言:javascript
复制
 def main():
 ask_user()



if __name__ == '__main__':
main()
EN

回答 1

Stack Overflow用户

发布于 2020-10-02 04:27:57

方法的作用是:通过指定的分隔符将给定的字符串断开,然后返回一个字符串列表。

语法:str.split(分隔符,最大拆分符)

  • 分隔符:这是分隔符。字符串在此指定的分隔符处拆分。如果没有提供,那么任何空格都是一个separator.
  • maxsplit :它是一个数字,它告诉我们将字符串拆分成所提供的最大次数。如果未提供,则没有限制。

由于您将信用卡号作为一个字符串,两个数字之间没有任何空格,因此在拆分信用卡号时,您将得到一个列表,其中包含整个信用卡号作为列表的单个元素(数字)。因此,数字列表的长度将始终为1,并且卡片长度函数将始终返回False。我建议你这样做:

代码语言:javascript
复制
    string = (str(input("Please input your credit card number")))
    numbers = list(map(int, list(string)))

接下来,让我解释一下Luhn算法是如何工作的:

将数字中的最后一位作为校验和。从校验和数字旁边(左侧)的数字开始的备用数字是双倍的。如果数字在加倍时变成两位数,则添加单个数字: 14 --> 1+4 =5 (或者)我们也可以从数字中减去9,这将得到相同的答案: 14-9 =5。所有数字(不包括校验和数字)现在都已相加。这些数字的总和乘以9,取该数字的mod 10。如果该数字的mod 10的结果等于校验和数字,则该数字是有效的。

这是为算法编写代码的一种方法:

代码语言:javascript
复制
    card_number = list(map(int, list(input('Enter the credit card number : '))))
    card_number.reverse()
    checksum = card_number.pop(0)

    for i in range(len(card_number)):
        if i % 2 == 0:
            x = card_number[i] * 2
            if len(str(x)) == 2:
                x -= 9
            card_number[i] = x

    total = sum(card_number) * 9
    total %= 10

    if total == checksum:
        print('It is a valid number')
    else:
        print('It is not a valid number')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64161183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档