我用Python实现了著名的Luhn算法。这是一个简单的,所以它是好的初学者。
import random
from math import ceil
def Luhn(digits):
if digits >= 2:
num = random.randrange(10**(digits-2),10**(digits-1))
num_digits = list(str(num))
for i in range(0,digits-1):
num_digits[i] = int(num_digits[i])
if digits % 2 == 0:
range_start = 0
else:
range_start = 1
for i in range(range_start,ceil((digits+range_start-1)/2)):
if digits % 2 == 0:
num_digits[2*i] *= 2
if num_digits[2*i] > 9:
num_digits[2*i] -= 9
else:
num_digits[2*i-1] *= 2
if num_digits[2*i-1] > 9:
num_digits[2*i-1] -= 9
checksum = sum(num_digits)
last_digit = checksum % 10
if last_digit != 0:
checknum = 10 - last_digit
else:
checknum = 0
num = num*10+checknum
return num
else:
return None它是一个函数,它接受一个参数(数字),并返回一个具有给定数字数的有效数字。代码非常简单,除了这一部分:
if digits % 2 == 0:
range_start = 0
else:
range_start = 1
for i in range(range_start,ceil((digits+range_start-1)/2)):
if digits % 2 == 0:
num_digits[2*i] *= 2
if num_digits[2*i] > 9:
num_digits[2*i] -= 9
else:
num_digits[2*i-1] *= 2
if num_digits[2*i-1] > 9:
num_digits[2*i-1] -= 9基本上,它所做的是‘乘2’部分的算法。这部分是故意的,所以不要考虑这一点。我只想挑战自己。
我想得到一些关于代码和可以改变的东西的反馈。
发布于 2015-07-22 14:03:28
我认为你用来检查哪些数字要乘2,哪些数字不能乘的逻辑都有点过度了。如果您从右到左生成数字,则总是偶数位数加倍。你也可以通过一次只生成一个数字来简化你的生活,而不是整个数字。如果这样做,甚至不需要将数字保存在列表中,因为您可以将它们直接添加到返回号中。对双位数字结果的另一个可能的优化是对值使用一个查找表。考虑到这些想法,我将您的代码重写为:
def luhn(digits):
"""
Generates a Luhn-algorithm-valid number of `digits` digits.
"""
digit_sum = 0
mult = 10
number = 0
for j in range(1, digits):
if j == digits - 1:
digit = random.randint(1, 9) # leading digit cannot be zero
else:
digit = random.randint(0, 9)
if j % 2:
# look-up table computes sum of digits of 2*digit
digit_sum += [0, 2, 4, 6, 8, 1, 3, 5, 7, 9][digit]
else:
digit_sum += digit
# build the number, one digit at a time
number += digit * mult
mult *= 10
# Add the check digit
number += digit_sum * 9 % 10
return numberhttps://codereview.stackexchange.com/questions/97676
复制相似问题