如何最好地确定数字到最右边的数字左边与奇数和偶数长度的数字?

问题描述 投票:0回答:2

我写代码来检查的信用卡号码输入一定次数是否有效。我已经写了:

function validCreditCard(value) {
    // accept only digits, dashes or spaces
    if (value.trim().length <= 1) return 'Value entered must be greater than 1';
    if (/[^0-9\s]+/.test(value)) return false;

    // Remove all white spaces
    value = value.replace(/\D/g, '');

    for (var i = 0; i < value.length; i++) {
    // code goes here
    // Loop through the string from the rightmost moving left and double the value of every second digit.
}

我一直在试图通过从最右边的字符串来总结我的周围如何循环头向左移动一位第二位的双重价值,因为该字符串的长度可以为偶数或奇数。例如,对于长度为16(偶数)的输入端,所述第一数量向左将是第15位(指数14),以及用于与奇数长度像11的输入端,所述第一数量向左将是第10个位置(索引9)。我写了一个程序,它并没有为这两种情况下工作,现在我想写一个以应付两者。我如何最好地做到这一点,而无需创建两个单独的检查,看是否输入的长度是奇数还是偶数?

P.S:有些实现网上没有为这两种情况下工作了。

javascript algorithm luhn
2个回答
1
投票

要知道哪些是你其实并不真的需要从年底开始到迭代“从右边每秒位数”。它也可以做到从左边到右边。知道一个位是否是这样的“第二”位,比较其奇/偶校验与所述输入的长度的奇偶校验。

所以像这样的:

var parity = value.length % 2;
for (var i = 0; i < value.length; i++) {
    if (i % 2 === parity) {
        // "Special" treatment comes here
    } else {
        // "Normal" treatment comes here
    }
}

但是,你也可以只在它前面加上零输入,如果它有一个奇怪的长度,给它的平均长度:

if (value.length % 2) value = '0' + value;
for (var i = 0; i < value.length; i++) {
    if (i % 2 === 0) {
        // "Special" treatment comes here
    } else {
        // "Normal" treatment comes here
    }
}

你正在实施被称为Luhn algorithm。因此,与使用长度的奇偶校验的,它可能是这样的:

function validCreditCard(value) {
    // Accept only digits, dashes or spaces
    if (/[^0-9\s-]+/.test(value)) return false;
    // Get the digits only
    value = value.replace(/\D/g, "");
    // Need at least one digit
    if (!value.length) return false;
    var parity = value.length % 2;
    var sum = 0;
    for (var i = 0; i < value.length; i++) {
        sum += i % 2 === parity
            ? (value[i]*2) % 10 + (value[i] > '4') // Double, and add one if double > 9
            : +value[i]; // Normal case
    }
    return sum%10 === 0;
}

console.log(validCreditCard("4024007112651582"));

Explanation:

在循环我已经取代了if...else...构建与conditional ternary operator - ... ? ... : ... - 在这两种情况下,你需要的值赋给一个变量(在我们的例子sum),这是一种实践。

对于“正常”的数字的sum必须与数字的值(+value[i]地)增加。加一元运算符将字符转换为其数值 - 所以+'1'变为1。

对于“特殊”的数字,sum必须与数字的两倍值(value[i]*2地)增加。请注意这里的从字符串转换为整数自动发生,因为乘法。

然后,我们需要处理这个地方双重价值由两个数字的情况。例如:8 * 2 = 16。在这种情况下,所得到的数字不应该是6,但7.因此,我们添加(value[i] > '4')。这确实是布尔表达式(falsetrue):当双有两个数字是真实的。通过添加布尔值,它被胁迫分别为0或1 - 正是我们所需要的。


0
投票

循环通过从最右边的字符串左移并每隔第二个数字的两倍值

您可以使用.reverse().map()和其余运营商%

let arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];

var res = [...arr].reverse().map((a, i) => i % 2 ? a * 2 : a).reverse();

console.log(res);
© www.soinside.com 2019 - 2024. All rights reserved.