Я пытаюсь запрограммировать алгоритм Луна на Java.

Мой текущий код:

import java.util.Scanner;

public class luhnAlgorithm {

public static void main(String[] args) {
    System.out.println("main() : Entry Point");

    Scanner input = new Scanner(System.in);

    long num;
    int digit;
    int sum = 0;
    System.out.println("Enter the digits of a credit card number : ");
    num = input.nextLong();


    while (num > 0) {
        digit = (int) num % 10;
        num = num / 10;

        if (num % 2 != 0 ) {
            digit *= 2;
        }

        if (digit > 9) {
            digit -= 9;
        }

        sum += digit;
    }

    if(sum % 10 == 0) {
        System.out.println("Credit card number is valid.");
    }
    else 
        System.out.println("Credit card number is invalid. Please try again.");


    System.out.println("main() : Exit Point");


    }

}

Проблема, с которой я сталкиваюсь, заключается в том, что когда я ввожу действующий номер кредитной карты, например: 4012888888881881 (через Счета тестовых кредитных карт PayPal), он говорит, что он недействителен. Но когда я ввожу номер своей дебетовой карты, он говорит, что она действительна.

Я знаю, что здесь какой-то код испорчен, я просто не могу понять, что именно.

Любая помощь будет оценена и благодарим заранее!

-1
jon 29 Окт 2015 в 02:01

2 ответа

Лучший ответ

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

    if (num % 2 != 0 ) {
        digit *= 2;
    }

Вы умножаете цифру, когда число нечетное, и в алгоритме Луна вы должны умножать цифру, когда эта цифра находится на четном месте в числе, двигаясь справа налево. Попробуйте добавить какой-нибудь индекс, который поможет вам узнать, стоит ли цифра на одном месте или нет.

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

Внимательно изучите этот https://en.wikipedia.org/wiki/Luhn_algorithm

Например, если у вас 68, то у вас есть: первая итерация: digit = 8, num = 6 и sum = 8 вторая итерация: digit = 6, num = 0 здесь вы должны умножить свою цифру на 2, потому что она находится на четном месте в количестве, но вы этого не делаете и sum = 14 вместо 20

4
Piotrowy 20 Авг 2019 в 12:56

Хорошо, я действительно разобрался :).

import java.util.Scanner;

/*
* Author : Jonathan Patterson
* Date : 10/28/15
* Program : Luhn Algorithm; validates credit card numbers
*/

public class luhnAlgorithm {

public static void main(String[] args) {
    System.out.println("main() : Entry Point");

    Scanner input = new Scanner(System.in);

    long num;
    double digit = 0;
    int sum = 0;
    int n = 1;
    int i = 0;
    System.out.println("Enter the digits of a credit card number : ");
    num = input.nextLong();

    while (num > 0) {
        digit = num % 10;
        num = num / 10;

        System.out.println(n + " digit is : " + digit);

        if (i % 2 != 0 ) {
            digit *= 2;
        }

        System.out.println(n + " digit is : " + digit);

        if (digit > 9) {
            digit = (digit % 10) + 1;
        }
        else 
            digit *= 1;

        System.out.println(n + " digit is : " + digit);

        sum += digit;
        n++;
        i++;
    }

    System.out.println("Sum of the digits is : " +sum);

    if(sum % 10 == 0) {
        System.out.println("Credit card number is valid.");
    }
    else 
        System.out.println("Credit card number is invalid. Please try again.");


    System.out.println("main() : Exit Point");


   }

}
0
jon 28 Окт 2015 в 23:33