- sumujemy cyfry nieparzyste (pierwszą, trzecią, piąta itd.),
- podwajamy cyfry parzyste (drugą, czwartą, szóstą itd.), jeśli podwojona wartość jest większa od 9, sumujemy cyfry (np. podwajamy 8, dostajemy 16, wartość większa od 9, sumujemy cyfry 1+6, dostajemy wynik 7),
- sumujemy otrzymane cyfry z kroku drugiego,
- dodajemy dwie sumy (dla cyfr parzystych i nieparzystych), jeśli wynik modulo 10 daje 0 to liczba jest poprawna, w przeciwnym przypadku niepoprawna.
Przeanalizujmy algorytm na prostym przykladzie. Mamy numer karty: 4853928344613904. Poruszamy się od prawej do lewej strony. Obliczamy sumę cyfr nieparzystych:
sumaNieparzystych = 4 + 9 + 1 + 4 + 3 + 2 + 3 + 8 = 34Obliczamy sumę podwojonych cyfr parzystych (jeśli podwojona wartość jest większa od 9 dodajemy poszczególne cyfry):
sumaParzystych = 0 + 6 + (1+2) + 8 + (1+6) + (1+8) + (1+0) + 8 = 42Dodajemy otrzymane wyniki:
sumaParzystych + sumaNieparzystych = 76Reszta z dzielenia 76 przez 10 (76 modulo 10) nie jest zerem więc nasz numer nie jest poprawny.
Zapiszmy algorytm wykorzystując Javę. Metoda czyPoprawna() zwróci nam wartość logiczną świadczącą o poprawności bądź też nie sprawdzanego ciągu cyfr.
/** * Implementacja algorytmu Luhna * @author kodatnik.blogspot.com */ public class AlgorytmLuhna { public static boolean czyPoprawna(String liczba){ // zmienne przechowujące odpowiednie sumy int sumaParzystych = 0, sumaNieparzystych = 0; // odwracamy liczbę dla uproszczenia obliczeń String odwroconaLiczba = new StringBuilder(liczba).reverse().toString(); // pętla dla poszczególnych cyfr for(int i = 0 ;i < odwroconaLiczba.length(); i++){ // zamieniamy znak cyfry na wartość liczbową int cyfra = Integer.parseInt(odwroconaLiczba.substring(i, i + 1)); // cyfra na pozycji nieparzystej if(i % 2 == 0) { // zwiększamy sumę sumaNieparzystych += cyfra; } // cyfra na pozycji parzystej else { // podwajamy cyfrę cyfra = cyfra * 2; // jeśli wynik większy od 9 to sumujemy cyfry wyniku if (cyfra > 9) cyfra = (cyfra%10)+1; // zwiększamy sumę sumaParzystych += cyfra; } } // zwracamy prawdę lub fałsz w zależności od wyniku modulo 10 return (sumaParzystych + sumaNieparzystych) % 10 == 0; } public static void main(String[] args) { System.out.println(czyPoprawna("4853928344613904")); System.out.println(czyPoprawna("4408041234567893")); } }Uruchomiona aplikacja:
false trueCzyli pierwsza liczba jest niepoprawna, a druga poprawna (oczywiście według algorytmu Luhna).
2 Komentarze - Algorytm Luhna
numerów IMEI nie sprawdza się algorytmem Luhna, ale algorytmem podobnym.
cenna wiedza
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)