0

即使我不明白为什么,我的代码输出也不正确。如果有人能对我的问题有所了解,我将不胜感激。

对于一个任务,我们将允许用户输入一个 15 或 16 位的信用卡号码并返回给定的号码是否有效。

我们正在使用 Luhn 的测试来验证数字,这是我的代码不起作用的地方。卡号 4222222222222220 应该返回有效,但我的卡号不起作用,我相信它是因为我不完全理解代码的含义。

Luhn 的测试:假设信用卡号由以下数字组成:

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()
4

1 回答 1

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's 算法。它涵盖了一个示例

于 2015-10-23T07:20:43.517 回答