У меня есть вопрос относительно следующего программирования.Подтвердить номер кредитной карты, используя алгоритм luhn
Номера кредитных карт соответствуют определенным шаблонам. Кредитная карта должна иметь от 13 до 16 цифр. Она должна начинаться с:
• 4 для карты Visa
• 5 для мастер-карт
• 37 карт American Express
В 1954 году Ганс Лун из IBM предложил алгоритм для проверки кредита номера карт. Алгоритм полезен для определения правильности ввода номера карты или проверки подлинности кредитной карты сканером. Почти все номера кредитных карт генерируются в соответствии с этой проверкой действительности, обычно известной как проверка Луна или проверка модуля 10, которая может быть описана следующим образом. Для иллюстрации рассмотрим номер карты 4388576018402625.
- Двойная каждая вторая цифра справа налево. Если удвоение цифры приводит к двузначному числу, добавьте две цифры, чтобы получить одноразрядное число.
2 х 2 = 4
2 х 2 = 4
4 х 2 = 8
1 х 2 = 2
6 х 2 = 12 (1+ 2 = 3)
5 х 2 = 10 (1 + 0 = 1)
8 х 2 = 16 (1 + 6 = 7)
4 х 2 = 8
Добавить все одиночные цифры номера с шага 4 1 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
Добавить все цифры в нечетных местах справа налево в номер карты
5 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 37
просуммировать результаты, полученные на стадии 2 и стадии 3 37 + 37 = 74
Если результат с шага делится на 10, номер карточки действителен; в противном случае это неверно. Например, номер 4388576018402625 недействителен, но номер 4388576018410707 является действительной картой Visa; номер 6011000593748745 недействителен, но номер 6011000593748746 является действительной карточкой Discover.
Я пытался решить, как показано в следующем коде:
import java.util.Scanner;
public class CreditCardValidation {
public static boolean isValid(long number) {
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=13) && (getSize(number)<=16)) {
return true;
} else {
return false;
}
}
public static int getDigit(int number) {
if (number <= 9) {
return number;
} else {
int firstDigit = number % 10;
int secondDigit = (int) (number/10);
return firstDigit + secondDigit;
}
}
public static int sumOfOddPlace(long number) {
int result = 0;
while (number > 0) {
result += (int) (number % 10);
number = number/100;
}
return result;
}
public static int sumOfDoubleEvenPlace(long number) {
int result = 0;
long temp = 0;
while (number > 0) {
temp = number % 100;
result += getDigit((int) (temp/10) * 2);
number = number/100;
}
return result;
}
public static boolean prefixMatched(long number, int d) {
if ((getPrefix(number, d) == 4)
|| (getPrefix(number, d) == 5)
|| (getPrefix(number, d) == 3)) {
if (getPrefix(number, d) == 3) {
System.out.println("\nVisa Card ");
} else if (getPrefix(number, d) == 5) {
System.out.println("\nMaster Card ");
} else if (getPrefix(number, d) == 3) {
System.out.println("\nAmerican Express Card ");
}
return true;
} else {
return false;
}
}
public static int getSize(long d) {
int count = 0;
while (d > 0) {
d = d/10;
count++;
}
return count;
}
public static long getPrefix(long number, int k) {
if (getSize(number) < k) {
return number;
} else {
int size = (int) getSize(number);
for (int i = 0; i < (size - k); i++) {
number = number/10;
}
return number;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter a credit card number as a long integer: ");
long input = sc.nextLong();
if (isValid(input) == true) {
System.out.println("\n" + input + " is Valid. ");
} else {
System.out.println("\n" + input + " is Invalid. ");
}
}
}
Мой вопрос, как я могу использовать массив для хранения номера кредитной карты вместо того, чтобы использовать длинный номер.
Вы можете использовать 'String' ... –
Я дал ответ на ваш второй пост, по-видимому, такой же вопрос сегодня - см. [link] (http://stackoverflow.com/questions/20740444/check-credit-card-validity-using-luhn-algorithm). –