2013-12-23 2 views
10

Я пытался проверить проверку кредитной карты, используя алгоритм Luhn, который работает как следующие шаги:Проверка действия кредитной карты с помощью алгоритма Luhn

  1. удваиваться каждые второй значного справа налево. Если удвоение цифры приводит к двузначному числу, добавьте две цифры, чтобы получить одноразрядное число.

    2 * 2 = 4

    2 * 2 = 4

    4 * 2 = 8

    1 * 2 = 2

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

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

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

    4 * 2 = 8

  2. Теперь добавьте все однозначными номера с шага 1.

    4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

  3. Добавьте все цифры в нечетные места справа налево в номере карты.

    6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

  4. Сумма результатов из шага 2 и Шаг 3.

    37 + 38 = 75

  5. Если результат шага 4 делится на 10, номер карты действителен; в противном случае это неверно. Например, номер 4388576018402626 недействителен, но номер 4388576018410707 действителен.

Просто моя программа всегда отображает действительные для всего, что я вводил. Даже если это допустимое число, и результат методов sumOfOddPlace и sumOfDoubleEvenPlace равен нулю.
Любая помощь приветствуется.

import java.util.Scanner; 
public class CreditCardValidation { 
     public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
     int count = 0; 
     long array[] = new long [16]; 
     do 
     { 
     count = 0; 
     array = new long [16]; 
     System.out.print("Enter your Credit Card Number : "); 
     long number = in.nextLong(); 
     for (int i = 0; number != 0; i++) { 
     array[i] = number % 10; 
     number = number/10; 
     count++; 
     } 
     } 
     while(count < 13); 
     if ((array[count - 1] == 4) || (array[count - 1] == 5) || (array[count - 1] == 3 && array[count - 2] == 7)){ 
      if (isValid(array) == true) { 
       System.out.println("\n The Credit Card Number is Valid. "); 
     } else { 
      System.out.println("\n The Credit Card Number is Invalid. "); 
     } 
     } else{ 
      System.out.println("\n The Credit Card Number is Invalid. "); 
     } 
    } 

    public static boolean isValid(long[] array) { 
     int total = sumOfDoubleEvenPlace(array) + sumOfOddPlace(array);   
     if ((total % 10 == 0)) { 
     for (int i=0; i< array.length; i++){ 
      System.out.println(array[i]);} 
      return true; 
     } else { 
      for (int i=0; i< array.length; i++){ 
      System.out.println(array[i]);} 
      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[] array) { 
     int result = 0; 
     for (int i=0; i< array.length; i++) 
     { 
     while (array[i] > 0) { 
      result += (int) (array[i] % 10); 
      array[i] = array[i]/100; 
     }} 
     System.out.println("\n The sum of odd place is " + result); 
     return result; 
    } 

    public static int sumOfDoubleEvenPlace(long[] array) { 
     int result = 0; 
     long temp = 0; 
     for (int i=0; i< array.length; i++){ 
     while (array[i] > 0) { 
      temp = array[i] % 100; 
      result += getDigit((int) (temp/10) * 2); 
      array[i] = array[i]/100; 
      } 
     } 
     System.out.println("\n The sum of double even place is " + result); 
     return result; 
    } 
    } 
+0

Когда я попытался 4242424242424242 в качестве входных данных, программа говорит «Номер кредитной карты действителен», который, как я полагаю, предполагается. Не могли бы вы рассказать нам конкретные данные, которые заставляют вашу программу давать неожиданный результат? – aquaraga

+0

Кроме того, номер, который вы дали «4388576018410707», также упоминается как действительный. – aquaraga

+0

Прошу прощения, я имел в виду, что он всегда дает «Номер кредитной карты действителен», если число начинается с 4, 5 или 37. Оно не соответствует второму условию, которое связано с суммированием методов sumOfOddPlace и sumOfDoubleEvenPlace. – user3126388

ответ

1

Я использую 5-значные номера карт для простоты. Предположим, что ваш номер карты ; если я прочитал код правильно, вы храните в array отдельные цифры:

array[] = {1, 2, 3, 4, 5} 

Поскольку у вас уже есть цифры, в sumOfOddPlace вы должны сделать что-то вроде

public static int sumOfOddPlace(long[] array) { 
    int result = 0; 
    for (int i = 1; i < array.length; i += 2) { 
     result += array[i]; 
    } 
    return result; 
} 

И в sumOfDoubleEvenPlace:

public static int sumOfDoubleEvenPlace(long[] array) { 
    int result = 0; 
    for (int i = 0; i < array.length; i += 2) { 
     result += getDigit(2 * array[i]); 
    } 
    return result; 
} 
9

Google и Wikipedia - ваши друзья. Вместо long-array я бы использовал int-array.На Wikipedia следующий код Java опубликован (вместе с подробным объяснением алгоритма Лун):

public static boolean check(int[] digits) { 
    int sum = 0; 
    int length = digits.length; 
    for (int i = 0; i < length; i++) { 

     // get digits in reverse order 
     int digit = digits[length - i - 1]; 

     // every 2nd number multiply with 2 
     if (i % 2 == 1) { 
      digit *= 2; 
     } 
     sum += digit > 9 ? digit - 9 : digit; 
    } 
    return sum % 10 == 0; 
    } 

Вы должны работать на вашем коде обработки ввода. Я предлагаю вам изучить следующее решение:

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    boolean repeat; 
    List<Integer> digits = new ArrayList<Integer>(); 

    do { 
     repeat = false; 
     System.out.print("Enter your Credit Card Number : "); 
     String input = in.next(); 

     for (int i = 0; i < input.length(); i++) { 
      char c = input.charAt(i); 
      if (c < '0' || c > '9') { 
       repeat = true; 
       digits.clear(); 
       break; 
      } else { 
       digits.add(Integer.valueOf(c - '0')); 
      } 
     } 
    } while (repeat); 

    int[] array = new int[digits.size()]; 
    for (int i = 0; i < array.length; i++) { 
     array[i] = Integer.valueOf(digits.get(i)); 
    } 
    boolean valid = check(array); 
    System.out.println("Valid: " + valid); 
} 
+0

Просто замечание: строка «array = new long [16];» внутри do-loop не может быть хорошо, потому что вы каждый раз сбрасываете массив. –

+0

Я проверял предложенное решение для вашего примера, номера кредитных карт 4388576018402626 (недействительный) и 4388576018410707 (действует). –

+0

Мне было бы интересно узнать о http://stackoverflow.com/questions/37352477/are-there-any-valid-credit-numbers-that-are-initial-substrings-of-other-valid-cr –

23

Вы можете свободно импортировать следующий код:

public class Luhn 
{ 
    public static boolean Check(String ccNumber) 
    { 
      int sum = 0; 
      boolean alternate = false; 
      for (int i = ccNumber.length() - 1; i >= 0; i--) 
      { 
        int n = Integer.parseInt(ccNumber.substring(i, i + 1)); 
        if (alternate) 
        { 
          n *= 2; 
          if (n > 9) 
          { 
            n = (n % 10) + 1; 
          } 
        } 
        sum += n; 
        alternate = !alternate; 
      } 
      return (sum % 10 == 0); 
    } 
} 

ссылка Ссылка: https://github.com/jduke32/gnuc-credit-card-checker/blob/master/CCCheckerPro/src/com/gnuc/java/ccc/Luhn.java

+0

идеальный ответ. – comeback4you

+0

Этот код не разрешает штрих-код на 0 (ноль), например, «1000000401330». Я нашел этот код и отлично работает: http://www.admfactory.com/luhn-algorithm-implementation-in-java/ – dellasavia

0
private static int luhnAlgorithm(String number){ 
    int n=0; 
    for(int i = 0; i<number.length(); i++){ 
     int x = Integer.parseInt(""+number.charAt(i)); 
     n += (x*Math.pow(2, i%2))%10; 
     if (x>=5 && i%2==1) n++; 
    } 
    return n%10; 
} 
+2

Сдача кода не дает хороших ответов. Вы должны объяснить * как * и * почему * это решает их проблему и почему этот ответ лучше, чем другие установленные ответы, которые мы уже имеем. Я рекомендую читать: «[Как написать хороший ответ?]] (Http://stackoverflow.com/help/how-to-answer) –

Смежные вопросы