我正在尝试实施Luhn的信用卡检查算法。我正在遵循代码大战问题中给出的所有步骤,甚至得到正确的结果,但在线评判不接受解决方案。我究竟做错了什么?我知道解决方案是天真的,它是一种蛮力,但仍然为什么我无法通过测试用例?
在此Kata中,您将实施Luhn算法,该算法用于帮助验证信用卡号。
给定最多16位数的正整数,如果是有效的信用卡号,则返回true,如果不是,则返回false。
以下是算法:
如果有偶数个数字,则从第一个开始,每隔一个数字加倍,如果有一个奇数个数字,则从第二个开始,每隔一个数字加倍。另一种思考方式是,从右到左,从第二位到最后一位开始,每隔一位数加倍。
1714 => [1 *,7,1 *,4] => [2,7,2,4]
12345 => [1,2 *,3,4 *,5] => [1,4,3,8,5]
891 => [8,9 *,1] => [8,18,1] 如果得到的加倍数大于9,则将其替换为自己的数字之和,或从中减去9。
[8,18 *,1] => [8,(1 + 8),1] => [8,9,1]
(或)
[8,18 *,1] => [8,(18-9),1] => [8,9,1] 求和所有最终数字 [8,9,1] => 8 + 9 + 1 => 18 最后,将该总和除以10.如果余数等于零,则原始信用卡号有效。
18(模量)10 => 8.
8不等于0,因此891不是有效的信用卡号。
function validate(n){
var num = [];
var i=0;
var v=n.toString();
while(i<v.length)
{
num.push(parseInt(v[i]));
i++;
}
if(num.length%2===0)
{
i=0;
while(i<num.length)
{
if((i+1)%2===1)
{
num[i]=num[i]*2;
}
i++;
}
}
else
{
i=0;
while(i<num.length)
{
if((i+1)%2===0)
{
num[i]=num[i]*2;
}
i++;
}
}
i=0;
if(num.length%2===0)
{
while(i<num.length)
{
if((i+1)%2===1)
{
if(num[i]>9)
{
num[i]=num[i]-9;
}
}
i++;
}
}
else
{
while(i<num.length)
{
if((i+1)%2===0)
{
if(num[i]>9)
{
num[i]=num[i]-9;
}
}
i++;
}
}
i=0;
var sum=0;
while(i<num.length)
{
sum+=num[i];
i++;
}
if(sum%10===0)
{
return true;
}
else
{
return false;
}
}