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

Luhn算法的实现
EN

Stack Overflow用户
提问于 2012-09-07 02:12:40
回答 13查看 35.6K关注 0票数 16

我正在尝试实现信用卡号码的简单验证。我读过关于Luhn算法维基百科的文章

  1. 从最右边的检查数字开始计数,然后向左移动,是每秒钟数字值的两倍。
  2. 乘积的数字之和(例如,10: 1+0= 1,14: 1+4= 5)加上来自原始数字的不容置疑的数字。
  3. 如果总模10等于0(如果总数以零结尾),那么根据Luhn公式,这个数字是有效的;否则它是无效的。

在维基百科上,对Luhn算法的描述非常容易理解。但是,我还看到了Luhn算法论Rosetta码其他地方 (归档)的其他实现。

这些实现工作得很好,但我对它们为什么可以使用数组来完成工作感到困惑。他们使用的数组似乎与Luhn算法无关,我看不出它们是如何实现Wikipedia描述的步骤的。

他们为什么要使用数组?它们的意义是什么?它们是如何实现维基百科描述的算法的?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2012-09-07 02:44:04

数组[0,1,2,3,4,-4,-3,-2,-1,0]用作查找数组,以查找0-9中的数字与其值2倍的数字之和之间的差异。例如,对于8号,8和(2*8) = 16 -> 1+6 =7之间的差值是7-8 = -1。

这里是图形表示,其中{n}表示n的数字之和。

代码语言:javascript
复制
[{0*2}-0, {1*2}-1, {2*2}-2, {3*2}-3, {4*2}-4, {5*2}-5, {6*2}-6, {7*2}-7....]
   |       |        |         |        |        |       |         |  
[  0  ,    1    ,   2    ,    3  ,     4   ,   -4  ,   -3   ,    -2  ....] 

您所列出的算法只对所有数字进行求和,对于每个偶数点数字,使用数组查找差异,并将其应用于总和。

票数 10
EN

Stack Overflow用户

发布于 2013-11-29 08:53:22

不幸的是,上面的代码对我都没有用。但我在GitHub上找到了一个可行的解决方案

代码语言:javascript
复制
// takes the form field value and returns true on valid number
function valid_credit_card(value) {
// accept only digits, dashes or spaces
    if (/[^0-9-\s]+/.test(value)) return false;

// The Luhn Algorithm. It's so pretty.
    var nCheck = 0, nDigit = 0, bEven = false;
    value = value.replace(/\D/g, "");

    for (var n = value.length - 1; n >= 0; n--) {
        var cDigit = value.charAt(n),
            nDigit = parseInt(cDigit, 10);

        if (bEven) {
            if ((nDigit *= 2) > 9) nDigit -= 9;
        }

        nCheck += nDigit;
        bEven = !bEven;
    }

    return (nCheck % 10) == 0;
}
票数 17
EN

Stack Overflow用户

发布于 2013-06-26 13:04:08

紧凑的Luhn验证器:

代码语言:javascript
复制
var luhn_validate = function(imei){
    return !/^\d+$/.test(imei) || (imei.split('').reduce(function(sum, d, n){ 
            return sum + parseInt(((n + imei.length) %2)? d: [0,2,4,6,8,1,3,5,7,9][d]);
        }, 0)) % 10 == 0;
};

对于CC和IMEI数字都很好。小提琴:http://jsfiddle.net/8VqpN/

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12310837

复制
相关文章

相似问题

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