Java - 如何检查 13 位 isbn 号码是否有效

标签 java

我需要编写一个程序,允许用户输入 13 位 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.");
        }
    }
}

最佳答案

修复您(自己的)当前代码

在您的原始代码中,有一些小错误:

isbnTotal = total + x;

total 未在任何地方声明,并且 isbnTotal 未初始化。

if (isbnTotal % 10 = 0) {

需要用双=进行比较,单数用于赋值,双==用于比较。


将代码分成模块以改进它

... determine and show whether the number is valid according to the formula above.

我想你忘记写公式了,但是根据Wikipedia ,是这个吗:

enter image description here

因此,您需要检查所有数字的总和乘以其权重(1 和 3 交替)是否是 10 的倍数。

因此,首先我们需要获得所有数字的总和,并将每个数字交替乘以 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;
}

让我解释一下上面的代码的作用,是利用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

关于Java - 如何检查 13 位 isbn 号码是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62479441/

相关文章:

java - 为什么 & 变成 &amp :amp; and how to solve this in XML?

Java 8 可选的多级空检查

java - 无法将服务代理 (sun.jvm.hotspot.HSDB) 连接到在 Windows 7(32 位)上运行的 jvm

java - 文件名、目录名或卷标语法不正确 - Kotlin - Maven

java - 如果操作不是由用户触发的,如何禁用 SWT 事件监听

java - 如何在 Avro 中定义 LogicalType。 ( java )

java - Hibernate-Spring 如何将我的保存转换为更新或保存?

java - 如何通过点击/单击两个按钮(组合)在文本框中显示文本

java - 如何使用 Java 的 RestTemplate 中的 RIOT API 获取 LOL 比赛详细信息?

java - Android - mysql php