Valider le numéro de carte de crédit à l'aide de l'algorithme de luhn

J'ai une question concernant la suite de la programmation de l'affectation.

Numéros de carte de crédit de suivre certaines tendances. Une carte de crédit doit avoir entre 13 et 16 chiffres. Il doit commencer par:

• 4 pour les cartes Visa

• 5 pour le Master cartes

• 37 pour les cartes American Express

En 1954, Hans Luhn d'IBM a proposé un algorithme de validation des numéros de carte de crédit. L'algorithme est utile pour déterminer si un numéro de carte est saisi correctement ou si une carte de crédit est numérisé correctement par un scanner. Presque tous les numéros de carte de crédit sont générés à la suite de cette vérification de sa validité, communément connu sous le Luhn chèque ou le Module 10, qui peut être décrit comme suit. Pour illustration, considérons le numéro de la carte 4388576018402625.

  1. Double à chaque seconde chiffres de droite à gauche. Si le doublement du chiffre résultats dans une partie à 2 chiffres, additionnez les deux chiffres pour obtenir un seul chiffre.

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

  1. Ajouter tous les numéros à deux chiffres à partir de l'étape 1
    4 + 4 +8 + 2 +3 + 1 + 7 + 8 = 37
  2. Ajouter tous les chiffres dans les recoins de la droite vers la gauche dans le numéro de la carte

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

  1. La somme des résultats à partir de l'étape 2 et l'étape 3
    37 + 37 = 74
  2. Si le résultat de l'étape est divisible par 10, le numéro de la carte est valide; sinon, il est invalide. Par exemple, le nombre 4388576018402625 est pas valide, mais le nombre 4388576018410707 est un Visa en cours de validité de la carte; le numéro de 6011000593748745 est pas valide, mais le nombre 6011000593748746 est valide carte à Découvrir.

J'ai essayé de le résoudre, comme illustré dans le code suivant:

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

Ma question est comment puis-je utiliser un tableau pour stocker le numéro de carte de crédit au lieu d'utiliser un numéro de long.

Vous pouvez utiliser un String...
J'ai donné une réponse à votre deuxième post de la apparemment même question aujourd'hui - voir link .

OriginalL'auteur user3126388 | 2013-12-22