Java - Как проверить, действителен ли номер isbn 13 di git - PullRequest
2 голосов
/ 20 июня 2020

Мне нужно написать программу, которая позволяет пользователю вводить 13-di git ISBN как одно целое число.

Затем программа должна определить и показать, является ли число действительным в соответствии с приведенной выше формулой. Также необходимо распечатать сообщение об ошибке, если пользователь пытается ввести число, длина которого превышает 13 цифр. Ниже приведен код, над которым я работаю.

Я новичок в java и не понимаю, где что-то пошло не так. Я также, кажется, не понимаю, как получить длину длинной переменной.

import java.util.Scanner;

public class ISBNChecker{
    public static void main(String [] args){
        long isbnNumber;
        long isbnTotal;
        long x;

        Scanner scnr = new Scanner(System.in);
        isbnNumber = scnr.nextLong();           

        while (isbnNumber > 0) {
            x = isbnNumber % 10;
            isbnTotal = total + x;
            isbnNumber = isbnNumber / 10;

            x = isbnNumber % 10;
            isbnTotal = total + (3 * x);
            isbnNumber = isbnNumber / 10;
        }

        if (isbnTotal % 10 = 0) {
            System.out.println("Number is valid!");
        }
        else {
            System.out.println("Number is invalid.");
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Исправьте свой (собственный) текущий код

В исходном коде есть пара мелких ошибок:

isbnTotal = total + x;

total нигде не объявлено, а isbnTotal не инициализируется.

if (isbnTotal % 10 = 0) {

Вам нужно сравнить с двойным =, одиночный - для присвоения, двойной == - для сравнения.


Разделите свой код в модули, чтобы улучшить его

... определить и показать, является ли номер действительным согласно приведенной выше формуле.

Я думаю, что вы забыли написать формулу, но согласно Википедии , это один:

enter image description here

Итак, вам нужно проверить, умножена ли сумма всех цифр на их вес (чередующийся 1 и 3) кратен 10.

Итак, прежде всего нам нужно получить сумму всех цифр и умножить каждое di git на 1 или 3, чередуя (в обратном порядке, как мы будем использовать оператор modulo).

Итак, нам нужно что-то вроде этого:

private static int getSum(long isbn) {
    int count = 0;
    int sum = 0;
    do {
        sum += count % 2 == 0 ? isbn % 10 : 3 * (isbn % 10);
        count++;
        isbn /= 10;
    } while (isbn > 0);
    return sum;
}

Позвольте мне xplain, что делает приведенный выше код, - это использовать оператор ternary (CTRL-F на странице, чтобы прочитать об этом), чтобы определить, нужно ли нам умножать на 1 или 3 в формуле, которую он запускает с 1, поэтому самый простой способ сделать это - проверить, является ли текущий индекс четным или нечетным, если четный, умножить на 1, в противном случае умножить на 3 и добавить это число к сумме.

Затем он делит текущее число на 10.

Затем все, что нам нужно сделать, это проверить, кратна ли сумма всех цифр, умноженных на их соответствующие веса, на 10.

private static boolean isAValidISBN(long isbn) {
    return getSum(isbn) % 10 == 0;
}

И непосредственно перед что, если в данном номере нет 13 цифр, мы говорим, что это не так.

Итак, в итоге наша программа должна быть примерно такой:

public class ISBNChecker {
    public static void main(String[] args) {
        String isbnNumber = "978030640615";
        if (isbnNumber.length() != 13) {
            System.out.println("ISBN Number is invalid");
            return;
        }

        if (isAValidISBN(Long.parseLong(isbnNumber))) {
            System.out.println(isbnNumber + " is a valid ISBN");
        } else {
            System.out.println(isbnNumber + " is not a valid ISBN");
        }
    }

    private static int getSum(long isbn) {
        int count = 0;
        int sum = 0;
        do {
            sum += count % 2 == 0 ? isbn % 10 : 3 * (isbn % 10);
            count++;
            isbn /= 10;
        } while (isbn > 0);
        return sum;
    }

    private static boolean isAValidISBN(long isbn) {
        return getSum(isbn) % 10 == 0;
    }
}

И если берем значение из Википедии, получаем такой вывод:

9780306406157 is a valid ISBN
1 голос
/ 20 июня 2020

Я не совсем понимаю ваш вопрос, но я полагаю, что вы хотите проверить, имеет ли номер, предоставленный пользователем, 13 цифр или нет, вы можете сделать это:

public static void main(String[] args) {

            String userNumber;  
            Scanner scnr = new Scanner(System.in);

            System.out.println("Enter ISBN number, 13 digit");

            userNumber = scnr.nextLine();

/*regular expression to verify that it contains only 13 digits*/
            if(userNumber.matches("^[0-9]{13}$")) {  
                System.out.println("Number is valid");
            } else {
                System.out.println("Number is invalid");
            }
    }
1 голос
/ 20 июня 2020

Прежде всего, что вы имеете в виду под:

согласно приведенной выше формуле.

Какую формулу вы имеете в виду? Во-вторых, чтобы получить длину длинного или целого числа, просто выполните:

int length = ("" + isbnNumber).length()

И, кстати, когда вы выполняете оператор if, сделайте «==» вместо «=».

if (isbnTotal % 10 = 0) {

… должно быть:

if (isbnTotal % 10 == 0) {

Или лучше, наоборот, чтобы компилятор обнаружил вашу опечатку.

if (0 == isbnTotal % 10) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...