用Java计算ISBN数字校验位

用Java计算ISBN数字校验位,java,algorithm,isbn,Java,Algorithm,Isbn,我试图计算任何ISBN-13号码的校验位,我不太担心ISBN号码是否有效,但我一直在努力让代码正常工作。我对该算法的解释显然存在缺陷,关于如何修复该算法的建议是受欢迎的,但主要问题是接收的用户输入对于整数变量来说太大,但我也希望避免使用双精度值的小数 我已经试过使用BigDecimal和BigNumber,但是我没有足够的经验来完全理解它们。这是查找d13(校验位)的算法:10-(d1+3d2+d3+3d4+d5+3d6+d7+3d8+d9+3d10+d11+3d12)%10 我知道代码很乱。我

我试图计算任何ISBN-13号码的校验位,我不太担心ISBN号码是否有效,但我一直在努力让代码正常工作。我对该算法的解释显然存在缺陷,关于如何修复该算法的建议是受欢迎的,但主要问题是接收的用户输入对于整数变量来说太大,但我也希望避免使用双精度值的小数

我已经试过使用
BigDecimal
BigNumber
,但是我没有足够的经验来完全理解它们。这是查找d13(校验位)的算法:10-(d1+3d2+d3+3d4+d5+3d6+d7+3d8+d9+3d10+d11+3d12)%10

我知道代码很乱。我用它作为我想做的事情的参考,我用这个ISBN号作为我的练习:
9780132130806

同样,我的问题是如何打印最终的ISBN数字而不带小数,以及如何修复算法?(我也非常感谢网站上提供的任何有助于教授作业的提示,因为这是我最喜欢使用的方法,因为它看起来比使用扫描仪更干净)



下面是一个基于的更简单的实现。它缺少健全性检查——比如输入字符串是否是有效的ISBN13——但应该足以让您继续。我希望有帮助

请注意,输入是一个ISBN-13字符串,其校验位已被删除(例如,
978013213080
而不是
9780132130806
);程序在输出端打印校验位;如果这不是您想要的,您应该能够修改它

public class CheckISBN13 {
    /* We assume isbnString is a *valid* ISBN-13 with the check digit removed.  */
    public static int[] stringToInt(String isbnString) {
        int[] isbnInt = new int[12];
        int j = 0;
        for (int i = 0; i < isbnString.length(); ++i) {
            if (Character.isDigit(isbnString.charAt(i))) {
                isbnInt[j++] = Character.getNumericValue(isbnString.charAt(i));
            }
        }
        return isbnInt;
    }

    public static int getCheckDigit(int[] isbnInt) {
        int val = 0;
        for (int i = 0; i < isbnInt.length; ++i) {
            int coeff = (i % 2 == 0 ? 1 : 3);
            val += coeff * isbnInt[i];
        }
        return 10 - (val % 10);
    }

    public static void main(String[] args) {
        if (args.length < 1) {
            System.err.println("Usage: java CheckISBN13 978-0-306-40615");
            System.exit(-1);
        }
        String isbnString = args[0];
        int[] isbnInt = stringToInt(isbnString);
        System.out.println("Check digit: " + getCheckDigit(isbnInt));
    }
}
公共类检查ISBN13{
/*我们假设isbnString是一个*有效*的ISBN-13,并且去掉了校验位*/
公共静态int[]stringToInt(String isbnString){
int[]isbnit=新int[12];
int j=0;
对于(int i=0;i
下面是一个基于的更简单的实现。它缺少健全性检查——比如输入字符串是否是有效的ISBN13——但应该足以让您继续。我希望有帮助

请注意,输入是一个ISBN-13字符串,其校验位已被删除(例如,
978013213080
而不是
9780132130806
);程序在输出端打印校验位;如果这不是您想要的,您应该能够修改它

public class CheckISBN13 {
    /* We assume isbnString is a *valid* ISBN-13 with the check digit removed.  */
    public static int[] stringToInt(String isbnString) {
        int[] isbnInt = new int[12];
        int j = 0;
        for (int i = 0; i < isbnString.length(); ++i) {
            if (Character.isDigit(isbnString.charAt(i))) {
                isbnInt[j++] = Character.getNumericValue(isbnString.charAt(i));
            }
        }
        return isbnInt;
    }

    public static int getCheckDigit(int[] isbnInt) {
        int val = 0;
        for (int i = 0; i < isbnInt.length; ++i) {
            int coeff = (i % 2 == 0 ? 1 : 3);
            val += coeff * isbnInt[i];
        }
        return 10 - (val % 10);
    }

    public static void main(String[] args) {
        if (args.length < 1) {
            System.err.println("Usage: java CheckISBN13 978-0-306-40615");
            System.exit(-1);
        }
        String isbnString = args[0];
        int[] isbnInt = stringToInt(isbnString);
        System.out.println("Check digit: " + getCheckDigit(isbnInt));
    }
}
公共类检查ISBN13{
/*我们假设isbnString是一个*有效*的ISBN-13,并且去掉了校验位*/
公共静态int[]stringToInt(String isbnString){
int[]isbnit=新int[12];
int j=0;
对于(int i=0;i
试试这个非常简单的算法(用Python编写,但它应该很容易转换成Java)。希望这些评论能解释得足够多。应转换为不超过10行(不包括可读性方面的空行)


(每个注释开头额外的
/
是为了让代码格式将其视为注释)

试试这个极其简单的算法(用Python编写,但它应该很容易转换为Java)。希望这些评论能解释得足够多。应转换为不超过10行(不包括可读性方面的空行)


(每个注释开头额外的
/
是为了让代码格式将其视为注释)

(起诉Java将被证明是困难的,因为它是印度尼西亚的一部分。至少,雅加达在Java上。)代码缺少注释:1)它要完成什么3)如何,代码的贡献在哪里不清楚。如果您对数字进行操作,那么首先使用Parse将它们组合起来,然后使用/%和十几个常量将它们分开是一种转移。尝试使用循环-超过12位数,或分别超过奇数和偶数位数。使用符号常量。根据规范的要求经常使用模数-最多。(起诉Java会很困难,因为它是印度尼西亚的一部分。至少,雅加达在Java上。)代码缺少注释:1)它要完成什么3)如何,代码的贡献在哪里不清楚。如果您对数字进行操作,那么首先使用Parse将它们组合起来,然后使用/%和十几个常量将它们分开是一种转移。尝试使用循环-超过12位数,或分别超过奇数和偶数位数。使用符号常量。尽可能多地使用模量
#// Valid ISBN-12 string from user (12 numbers, doesn't matter what other characters)
isbn12 = '978-0-306-40615' #// Input it from the user, hardcoded Wikipedia example for testing
coeff = 1 #// Multiple used in calculating sum
sum = 0

for d in isbn12: #// Equivalent to for(char d : isbn12.toCharArray())
    #// this next block is just a tryParse or an isDigit check
    #// if the character is a digit, parse it to an int
    #// else continue to next iteration
    try:
        #// just reassigning the value because-
        #// Hey, this is Python!
        d = int(d)
    except ValueError:
        continue

    #// Add to sum after multiplying with coeff
    sum += d * coeff
    #// If coeff was 1, change to 3 and vice versa
    #// Equivalent to coeff == 1 ? 3 : 1 in Java
    coeff = 3 if coeff == 1 else 1

#// END FOR LOOP

#// Get positive number to be added to make ISBN divisible by 10
#// The extra % 10 at the end is for changing 10 to 0 without if
check_digit = (10 - sum % 10) % 10