我正在尝试实现信用卡号码的简单验证。我读过关于Luhn算法维基百科的文章
在维基百科上,对Luhn算法的描述非常容易理解。但是,我还看到了Luhn算法论Rosetta码和其他地方 (归档)的其他实现。
这些实现工作得很好,但我对它们为什么可以使用数组来完成工作感到困惑。他们使用的数组似乎与Luhn算法无关,我看不出它们是如何实现Wikipedia描述的步骤的。
他们为什么要使用数组?它们的意义是什么?它们是如何实现维基百科描述的算法的?
发布于 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的数字之和。
[{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 ....] 您所列出的算法只对所有数字进行求和,对于每个偶数点数字,使用数组查找差异,并将其应用于总和。
发布于 2013-11-29 08:53:22
不幸的是,上面的代码对我都没有用。但我在GitHub上找到了一个可行的解决方案
// 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;
}发布于 2013-06-26 13:04:08
紧凑的Luhn验证器:
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/
https://stackoverflow.com/questions/12310837
复制相似问题