问题描述
我必须为我的课程计算思维分配作业,但是当我输入此有效信用卡号作为输入时,它总是说该号码无效,有人知道为什么吗?
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')