Срок действия номера кредитной карты по алгоритму Луна (Java)
Я работаю над школьным заданием, которое проверяет, является ли введенный номер кредитной карты действительным или нет, используя алгоритм Луна.
В 1954 году Ханс Лун из IBM предложил алгоритм проверки номеров кредитных карт. Алгоритм полезен для определения того, правильно ли введен номер карты или правильно ли сканируется кредитная карта сканером. Номера кредитных карт генерируются после этой проверки действительности, обычно называемой проверкой Луна или проверки Mod 10, которая может быть описана следующим образом (для иллюстрации рассмотрим номер карты 4388 5760 1840 2626
):
Удваивайте каждую вторую цифру справа налево. Если в результате удвоения цифры получается двузначное число, сложите две цифры, чтобы получить однозначное число.
Теперь добавьте все однозначные числа из шага 1:
4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
Добавьте все цифры в нечетных местах справа налево в номере карты:
6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38
Суммируйте результаты из шага 2 и шага 3:
37 + 38 = 75
Если результат шага 4 делится на 10, номер карты действителен; в противном случае это недействительно. Например, число
4388 5760 1840 2626
неверно, но номер4388 5760 1841 0707
является действительным.
Мне нужно написать эту программу, используя методы в коде, который я написал:
public class CreditCardValidation {
public static void main(String[] args, long input) {
Scanner numberinput = new Scanner(System.in);
System.out.println("Enter a credit card number as a long integer: ");
long cardnumber = numberinput.nextLong();
if (isValid(input) == true) {
System.out.println(numberinput + " is valid.");
} else {
System.out.println(numberinput + " is invalid.");
}
}
public static boolean isValid(long number){
int total = sumOfDoubleEvenPlace + sumOfOddPlace;
return (total % 10 == 0) && (prefixMatched(number, 1) == true) &&
(getSize(number)>=13) && (getSize(number)<=16);
}
public static int sumOfDoubleEvenPlace(long number) {
int doubledevensum = 0;
long place = 0;
while (number > 0) {
place = number % 100;
doubledevensum += getDigit((int) (place / 10) * 2);
number = number / 100;
}
return doubledevensum;
}
public static int sumOfOddPlace(long number) {
int oddsum = 0;
while (number <= 9) {
oddsum += (int)(number % 10);
number = number % 100;
}
return oddsum;
}
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 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;
}
}
}
Я только начал учиться программировать два месяца назад, поэтому я довольно новичок в этом. Программа не компилируется, и я не знаю, почему и что я должен сделать, чтобы это исправить. Я знаю, что уже есть похожие темы по этому поводу, и я использовал этот пост, чтобы помочь мне немного. Может ли кто-нибудь помочь направить студента в правильном направлении и сообщить, что я делаю неправильно?
2 ответа
Ваша программа не компилируется, потому что эта строка:
int total = sumOfDoubleEvenPlace + sumOfOddPlace;
поскольку sumOfDoubleEvenPlace
а также sumOfOddPlace
являются функциями, вы должны использовать их как таковые:
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
В функции isValid вы пытаетесь добавить две переменные, которые не существуют. Однако вы определили их как функции, и чтобы использовать их как функции, вы должны вызывать их как функции, используя
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);