Что не так с моим кодом алгоритма Луна?

#java #checksum #luhn

#java #контрольная сумма #лунь

Вопрос:

Я пытаюсь использовать этот код, чтобы проверить, является ли пример кода действительным номером кредитной карты или нет (используя алгоритм Луна) в Java. Где я ошибся? Он принимает массив из 16 однозначных чисел. Любая помощь была бы высоко оценена. Спасибо!

 private static boolean isValidCC(int[] number) {
    int sum = 0;
    boolean alternateNum = true;
    for (int i = number.length-1; i>=0; i--) {
        int n = number[i];
        if (alternateNum) {
            n *= 2;
            if (n > 9) {
                n = (n % 10)   1;
            }
        }
        sum  = n;
        alternateNum = !alternateNum;
    }
    System.out.println(sum);
    return (sum % 10 == 0);
}
  

Комментарии:

1. Что заставило вас подумать, что вы ошиблись? Вы получаете ошибку? Неожиданные результаты? Пожалуйста, добавьте детали и полученный результат

Ответ №1:

Ваш код правильный, за исключением того, что вы начали с неправильной альтернативной цифры. Изменить на:

 boolean alternateNum = false;
  

Комментарии:

1. Ты быстрее 🙂 Похоже, это настоящая причина.

Ответ №2:

Судя по статье в Википедии — вы пропустили цифру контрольной суммы или ошибочно приняли ее во внимание -.

Обновление: скорее всего, вы начали с неправильного флага «альтернативный».

Есть фрагмент Java, так почему бы не использовать его?

   public static boolean isValidCC(String number) {

    final int[][] sumTable = {{0,1,2,3,4,5,6,7,8,9},{0,2,4,6,8,1,3,5,7,9}};
    int sum = 0, flip = 0;

    for (int i = number.length() - 1; i >= 0; i--) {
      sum  = sumTable[flip   amp; 0x1][Character.digit(number.charAt(i), 10)];
    }
    return sum % 10 == 0;
  }
  

Ответ №3:

Чередующиеся цифры удваиваются, считая с конца, а не с начала.

вместо использования вашего alternateNum bool попробуйте это.

 if((number.length - i) % 2 == 0){
    n *= 2;
    ...
}