Проверка длинной / строки кредитной карты

Я работаю над заявкой на подтверждение номера кредитной карты.

Я могу ввести либо действительный номер, либо недействительный, но вывод никогда не принимает данные и не считывает их действительными. Я пытаюсь понять, каков правильный алгоритм проверки кредитной карты.

Ниже мой желаемый результат. Мне нужно знать, в какой точке моего цикла или моего использования long vs. string я ошибаюсь, что приведет к тому, что вывод всегда будет считаться недействительным.

Образец 1:

Enter a credit card number: 4246345689049834

4246345689049834 is invalid

Образец 2:

Enter a credit card number: 4388576018410707

4388576018410707 is valid

Однако в моем коде я получаю следующий вывод

Образец 1:

Enter a credit card number: 4246345689049834

4246345689049834 is invalid

Образец 2:

Enter a credit card number: 4388576018410707

4388576018410707 is invalid 

Код:

    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter Credit Card Number for Validation: ");
        long number = input.nextLong();

        long total = sumOfEvenPlaces(number) + sumOfOddPlaces(number);

        if (isValid(total)) {
            System.out.println(number + " is valid");
        } else {
            System.out.println(number + " is invalid");
        }
    }

    public static boolean isValid(long total) {
        if (total % 10 == 0) {
            return true;
        }
        return false;
    }

    public static int sumOfEvenPlaces(long number) {
        int sum = 0;
        int remainder;
        number %= 10;
        while (number % 10 != 0 || number / 10 != 0) {
            remainder = (int) (number % 10);

            sum = sum + getDigit(remainder * 2);
            number /= 100;
        }
        return sum;
    }

    public static int getDigit(int number) {
        if (number > 9) {
            return (number % 10 + number / 10);
        }
        return number;
    }

    public static int sumOfOddPlaces(long number) {
        int sum = 0;
        int remainder;

        while (number % 10 != 0 || number / 10 != 0) {
            remainder = (int) (number % 10);
            sum = sum + getDigit(remainder);
            number /= 100;
        }
        return sum;
    }
}
Что говорит вам ваш пошаговый отладчик?. На ваш вопрос можно очень быстро и легко ответить с помощью пошагового отладчика. Вы всегда должны пытаться решить свои проблемы с помощью пошагового отладчика, прежде чем переходить на StackOverflow. Если вы просите кого-нибудь запустить ваш код, отладить его в пошаговом отладчике и исправить за вас, вы должны знать, что сайт работает не так. Это объясняется в ссылках, которые я разместил в других моих комментариях. отлаживать дамп моего кода для меня тоже не вопрос
user177800 04.08.2018 23:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
1
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть ошибка в методах sumOfEvenPlaces() и sumOfOddPlaces().

В sumOfEvenPlaces(long number) нужно поменять

 number %= 10; 

к

 number /= 10;

Вы можете пропустить цифру только с помощью числа / 10, а не числа% 10

И в обеих функциях меняем

 while (number % 10 != 0 || number / 10 != 0)

к

 while (number > 0)

при использовании while (число> 0) цикл будет работать до тех пор, пока не будут обработаны все цифры числа.

Попробуйте эти модифицированные методы, это будет работать: -

public static int sumOfEvenPlaces(long number) {
    int sum = 0;
    int remainder;
    number /= 10;          // change 1
    while (number > 0) {   // change 2
        remainder = (int) (number % 10);
        sum = sum + getDigit(remainder * 2);
        number /= 100;
    }
    return sum;
}

public static int sumOfOddPlaces(long number) {
    int sum = 0;
    int remainder;

    while (number > 0) {   // change 3 
        remainder = (int) (number % 10);
        sum = sum + getDigit(remainder);
        number /= 100;
    }
    return sum;
}

Выход :-

Enter Credit Card Number for Validation: 
 4246345689049834
4246345689049834 is invalid

Другие вопросы по теме