微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Luhns算法,mod 10检查

如何解决Luhns算法,mod 10检查

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

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")

“”“ 此功能以信用卡号为参数,并检查信用卡号的长度 看看它是否有效。 “”“

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

“”“ 此方法获取数字列表,并告诉用户它是否与打印语句有效组合 “”“

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")

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

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

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

def odd_digits(numbers):
length = len(numbers)
sumOdd = 0
for i in range(length - 1,-2):
    numbers += sumOdd
return sumOdd

“”“ 这是定义我们第一个函数ask_user的主要函数 “”“

 def main():
 ask_user()



if __name__ == '__main__':
main()

解决方法

split()方法用指定的分隔符将给定的字符串分隔开后,将返回一个字符串列表。

语法:str.split(分隔符,maxsplit)

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

由于您将信用卡号作为一个字符串,数字之间没有任何空格,因此,在拆分信用卡号时,您将获得一个列表,其中包含整个信用卡号,并将其作为列表中的单个元素。因此,数字列表的长度将始终为1,而卡长度功能将始终返回False。我建议你做类似的事情:

    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的结果等于校验和数字,则该数字有效。

这是您可以编写算法代码的方式之一:

    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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。