我需要编写一个程序,允许用户输入 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 ,是这个吗:
因此,您需要检查所有数字的总和乘以其权重(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/