首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Luhn算法的实现

Luhn算法的实现
EN

Code Review用户
提问于 2015-07-22 10:45:22
回答 1查看 2.1K关注 0票数 5

我用Python实现了著名的Luhn算法。这是一个简单的,所以它是好的初学者。

代码语言:javascript
复制
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

它是一个函数,它接受一个参数(数字),并返回一个具有给定数字数的有效数字。代码非常简单,除了这一部分:

代码语言:javascript
复制
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’部分的算法。这部分是故意的,所以不要考虑这一点。我只想挑战自己。

我想得到一些关于代码和可以改变的东西的反馈。

EN

回答 1

Code Review用户

发布于 2015-07-22 14:03:28

我认为你用来检查哪些数字要乘2,哪些数字不能乘的逻辑都有点过度了。如果您从右到左生成数字,则总是偶数位数加倍。你也可以通过一次只生成一个数字来简化你的生活,而不是整个数字。如果这样做,甚至不需要将数字保存在列表中,因为您可以将它们直接添加到返回号中。对双位数字结果的另一个可能的优化是对值使用一个查找表。考虑到这些想法,我将您的代码重写为:

代码语言:javascript
复制
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 number
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/97676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档