Überprüfen Sie die Kreditkartennummer mit dem Luhn-Algorithmus

Ich habe eine Frage zu folgender Programmieraufgabe.

Kreditkartennummern folgen bestimmten Mustern. Eine Kreditkarte muss zwischen 13 und 16 Ziffern haben. Es muss beginnen mit:

• 4 für Visa-Karten

• 5 für Master-Karten

• 37 für American Express-Karten

1954 schlug Hans Luhn von IBM einen Algorithmus zur Validierung von Kreditkartennummern vor. Der Algorithmus ist hilfreich, um festzustellen, ob eine Kartennummer korrekt eingegeben wurde oder ob eine Kreditkarte von einem Scanner korrekt gescannt wurde. Fast alle Kreditkartennummern werden nach dieser Gültigkeitsprüfung generiert, die allgemein als Luhn-Prüfung oder Modul 10-Prüfung bezeichnet wird und wie folgt beschrieben werden kann. Betrachten Sie zur Veranschaulichung die Kartennummer 4388576018402625.

Verdoppeln Sie jede zweite Ziffer von rechts nach links. Wenn das Verdoppeln einer Ziffer zu einer zweistelligen Zahl führt, addieren Sie die beiden Ziffern, um eine einstellige Zahl zu erhalten.

2 x 2 = 4

2 x 2 = 4

4 x 2 = 8

1 x 2 = 2

6 x 2 = 12 (1 + 2 = 3)

5 x 2 = 10 (1 + 0 = 1)

8 x 2 = 16 (1 + 6 = 7)

4 x 2 = 8

Addieren Sie alle einstelligen Zahlen aus Schritt 1 4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

Fügen Sie alle Ziffern an den ungeraden Stellen von rechts nach links in die Kartennummer ein

5 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 37

Summieren Sie die Ergebnisse aus Schritt 2 und Schritt 3 37 + 37 = 74

Wenn das Ergebnis aus Schritt durch 10 teilbar ist, ist die Kartennummer gültig. Andernfalls ist es ungültig. Beispielsweise ist die Nummer 4388576018402625 ungültig, aber die Nummer 4388576018410707 ist eine gültige Visa-Karte. Die Nummer 6011000593748745 ist ungültig, aber die Nummer 6011000593748746 ist eine gültige Discover-Karte.

Ich habe versucht, es zu lösen, wie im folgenden Code gezeigt:

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. ");
        }

    }
} 

Meine Frage ist, wie ich ein Array verwenden kann, um die Kreditkartennummer zu speichern, anstatt eine lange Nummer zu verwenden.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage