#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;
...
}