我的代码输出不正确,即使我看不清楚原因。如果有人能解释我的问题,我会非常感激。
对于作业,我们允许用户输入15或16位信用卡号,并返回给定的号码是否有效。
我们正在使用Luhn的测试来验证数字,这是我的代码无效的地方。卡号4222222222222220应该返回有效,但我的工作不起作用,我相信它,因为我不完全理解代码的意图。
Luhn's Test:我们说信用卡号由以下数字组成:
d15 d14 d13 d12 d11 d10 d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
最后一位数字d0是Luhn算法中的校验位。算法如下:
将所有奇数位d1,d3,... d15乘以2。
对每种产品的数字求和。
现在添加所有偶数位d0,... d14和奇数位的单位数产品。
如果最终金额可以被10整除,则信用卡有效,否则无效。
我的代码是:
def len_check(x):
length = len(str((x)))
if (length == 15) or (length == 16):
return True
else:
return False
def is_valid(x):
card = x
num_list= list((str(card)))
sum_odd = 0
sum_even = 0
even_count = 0
odd_count = 0
total_sum = 0
length = 0
for i in num_list:
length += 1
print(length)
count = 0
if length == 16:
odd_count = 15
even_count = 14
if length == 15:
odd_count = 13
even_count = 14
print(even_count)
print(odd_count)
while (count <= length-2):
print('even count', even_count)
print('D-even', num_list[even_count])
sum_even += int(num_list[even_count])
even_count -=2
print('sum even', sum_even)
print('odd count', odd_count)
print('D-odd', num_list[odd_count])
prod = 2 * int(num_list[odd_count])
sum_odd += prod
odd_count -=2
print('sum odd', sum_odd)
count +=2
total_sum = sum_odd + sum_even
print('total sum', total_sum)
if total_sum % 10 == 0:
return True
else:
return False
def main():
cc_num = int(input('Enter at 15 or 16-digit credit card number: '))
if not len_check(cc_num):
print('Not a 15 or 16-digit number')
else:
if not is_valid(cc_num):
print('Invalid credit card number')
else:
print('valid card number')
main()
答案 0 :(得分:2)
程序对我的逻辑不是很清楚。首先,不清楚为什么你只循环到长度为2;如果有15个数字,你可能会错过一个数字作为长度,你将错过一个偶数(循环运行7次,从0到14有8个偶数)。
现在,如果数字位于奇数位置,则乘以2并直接添加它们。根据算法,您应该取数字的总和,然后添加。因此,如果奇数位数为9且2 * 9 = 18;然后你应该添加数字(给出1 + 8),然后将其添加到sum_add。这是我注意到的另一个缺陷。
还有一件事;为了计算列表的长度,您可以使用len(num_list)。你也应该使用list.reverse来反转列表,因为在15位数字的情况下你会遇到问题。
如果使用列表理解,可以使程序更好。像这样的东西
num_list = num_list.reverse
even_list = [num_list[i] for i in xrange(0,len(num_list),2)]
odd_list = [num_list[i] for i in xrange(1,len(num_list),2)]
这将分隔你的偶数和奇数,你可以相应地进行。 另外,要查找数字的总和,您可以检查数字是否大于9.如果数字大于9,您将获得总和。
您可以浏览此链接以了解算法
Luhn's Algorithm
向下滚动到luhn的算法。它涵盖了一个例子