Valide el número de tarjeta de crédito usando el algoritmo luhn

Tengo una pregunta con respecto a la siguiente asignación de programación.

Los números de tarjetas de crédito siguen ciertos patrones. Una tarjeta de crédito debe tener entre 13 y 16 dígitos. Debe comenzar con:

• 4 para tarjetas Visa

• 5 para tarjetas Master

• 37 para tarjetas American Express

En 1954, Hans Luhn de IBM propuso un algoritmo para validar números de tarjetas de crédito. El algoritmo es útil para determinar si un número de tarjeta se ingresó correctamente o si un escáner escanea correctamente una tarjeta de crédito. Casi todos los números de tarjeta de crédito se generan después de esta verificación de validez, comúnmente conocida como la verificación Luhn o la verificación Modulus 10, que se puede describir a continuación. Para ilustrar, considere la tarjeta número 4388576018402625.

Doble cada segundo dígito de derecha a izquierda. Si la duplicación de un dígito da como resultado un número de 2 dígitos, sume los dos dígitos para obtener un número de un solo dígito.

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

Suma todos los números de un solo dígito del paso 1 4 + 4 +8 + 2 +3 + 1 + 7 + 8 = 37

Agregue todos los dígitos en los lugares impares de derecha a izquierda en el número de tarjeta

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

Sume los resultados del paso 2 y del paso 3 37 + 37 = 74

Si el resultado del paso es divisible por 10, el número de tarjeta es válido; de lo contrario, es inválido Por ejemplo, el número 4388576018402625 no es válido, pero el número 4388576018410707 es una tarjeta Visa válida; El número 6011000593748745 no es válido, pero el número 6011000593748746 es una tarjeta válida de Discover.

Intenté resolverlo como se muestra en el siguiente código:

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

    }
} 

Mi pregunta es cómo puedo usar una matriz para almacenar el número de la tarjeta de crédito en lugar de usar un número largo.

Respuestas a la pregunta(5)

Su respuesta a la pregunta