验证python中的信用卡号

时间:2015-10-23 06:39:47

标签: python list luhn

我的代码输出不正确,即使我看不清楚原因。如果有人能解释我的问题,我会非常感激。

对于作业,我们允许用户输入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()

1 个答案:

答案 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的算法。它涵盖了一个例子