【问题标题】:Java - How to check if a 13 digit isbn number is validJava - 如何检查 13 位 isbn 号码是否有效
【发布时间】:2020-06-19 22:33:00
【问题描述】:

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

【问题讨论】:

  • 你得到了什么错误,它告诉你错误在哪一行?
  • 当你可以将它作为字符串读取时,为什么要立即读取它,然后检查它的长度,然后解析它?
  • 读取为字符串解决了多个问题,因为在使用模运算符检查有效性之前,您必须将每个数字乘以其在数字中的位置并将所有这些值相加。这意味着您可以在一个已知持续时间的循环中完成所有事情(想想 for,而不是 while)。

标签: java


【解决方案1】:

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

在您的原始代码中,您有几个小错误:

isbnTotal = total + x;

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

if (isbnTotal % 10 = 0) {

你需要和双=比较,单是赋值,双==比较。


将您的代码分成模块以改进它

...根据上面的公式判断并显示数字是否有效。

我想你忘了写公式,但是根据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;
    }
}

如果我们采用 Wikipedia 值,我们会得到以下输出:

9780306406157 is a valid ISBN

【讨论】:

    【解决方案2】:

    我不清楚你的问题,但我想你想要做的是验证用户提供的号码是否有 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");
                }
        }
    

    【讨论】:

      【解决方案3】:

      首先,你的意思是:

      根据上面的公式。

      你的意思是什么公式?其次,要获取 long 或 integer 的长度,只需:

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

      顺便说一句,当您执行if 语句时,请执行“==”而不是“=”。

      if (isbnTotal % 10 = 0) {
      

      ……应该是:

      if (isbnTotal % 10 == 0) {
      

      或者更好,反向,这样编译器就会发现你的错字。

      if (0 == isbnTotal % 10) {
      

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 1970-01-01
        • 2022-06-21
        • 1970-01-01
        • 2017-10-27
        • 2019-12-20
        • 1970-01-01
        • 2010-12-27
        • 2017-01-21
        相关资源
        最近更新 更多