Java-如何检查13位isbn数字是否有效
我需要写一个程序,允许用户输入一个13位的ISBN作为一个整数 然后,程序应根据上述公式确定并显示数字是否有效。如果用户试图输入超过13位的数字,它还需要打印一条错误消息。 下面是我正在处理的代码 我是java新手,不知道哪里出了问题。我似乎也不知道如何获得长变量的长度Java-如何检查13位isbn数字是否有效,java,Java,我需要写一个程序,允许用户输入一个13位的ISBN作为一个整数 然后,程序应根据上述公式确定并显示数字是否有效。如果用户试图输入超过13位的数字,它还需要打印一条错误消息。 下面是我正在处理的代码 我是java新手,不知道哪里出了问题。我似乎也不知道如何获得长变量的长度 import java.util.Scanner; public class ISBNChecker{ public static void main(String [] args){ long isb
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.");
}
}
}
首先,你是什么意思: 根据上面的公式 你是什么意思?第二,要得到long或整数的长度,只需执行以下操作:
int length = ("" + isbnNumber).length()
顺便说一句,当您执行if
语句时,请执行“==”而不是“=”
……应该是:
if (isbnTotal % 10 == 0) {
或者更好的方法是,反向编译,这样编译器就可以捕捉到您的输入错误
if (0 == isbnTotal % 10) {
我不清楚您的问题,但我想您要做的是验证用户提供的号码是否有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");
}
}
修复(自己的)当前代码
在原始代码中,有几个小错误:
isbnTotal = total + x;
total
未在任何位置声明,并且isbntottal
未初始化
if (isbnTotal % 10 = 0) {
您需要与double=
进行比较,一个用于分配,double=
用于比较
将代码分成模块以改进它 。。。根据上述公式确定并显示数字是否有效 我想你忘了写公式,但根据,是这样的: 因此,您需要检查所有数字的总和乘以它们的权重(交替1和3)是否为10的倍数
private static boolean isAValidISBN(long isbn) {
return getSum(isbn) % 10 == 0;
}
因此,首先我们需要得到所有数字的总和,然后交替地将每个数字乘以1或3(向后,因为我们将使用模
运算符)
所以,我们需要这样的东西:
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;
}
让我解释一下上面的代码的作用,就是利用操作符(页面上的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;
}
}
如果我们取Wikipedia值,我们会得到以下输出:
9780306406157 is a valid ISBN
你会得到什么错误,它告诉你错误在哪一行?当你可以把它作为字符串来读的时候,为什么要马上读一个长的,然后检查它的长度,然后解析它?读取为字符串解决了多个问题,因为在使用模运算符检查有效性之前,必须将每个数字乘以其在数字中的位置,并将所有这些值相加。这意味着您可以在已知持续时间的单个循环中完成所有操作(考虑时间,而不是时间)。