校验和 - ISBN程序

时间:2013-12-09 18:31:54

标签: java loops object isbn

这个问题让我感到困惑。我尝试使用这样的循环:基本上我试图从输入中获取第一个数字并执行公式,但它似乎不起作用。它看起来很简单,但我无法弄清楚。你可以帮帮我吗?感谢。

public static int ISBN(String ninedigitNum) {
   number = 9;
   while (number > 0) {
   int nextDigit = ninedigitNum.substring(0,1);

   ...
}
  

校验和(来源:普林斯顿大学)。国际标准   书号(ISBN)是一个10位数的代码,用于唯一指定书籍。   最右边的数字是校验和数字,它可以是唯一的   根据条件d1 + 2d2 +的其他9位数确定   3d3 + ... + 10d10必须是11的倍数(这里di表示第i个   右边的数字)。校验和数字d1可以是0的任何值   到10:ISBN约定是使用值X来表示10。   示例:对应于020131452的校验和数字是5   d1在0和10之间的唯一值,其中d1 + 2 * 2 + 3 * 5 +   4 * 4 + 5 * 1 + 6 * 3 + 7 * 1 + 8 * 0 + 9 * 2 + 10 * 0是11的倍数。创建一个   Java方法ISBN()以9位整数作为输入,计算   校验和,并返回10位数的ISBN号。创建3个JUnit测试   案例来测试你的方法。

我明白了,非常感谢大家!

4 个答案:

答案 0 :(得分:2)

它不起作用?无论哪种方式,我相信你所缺少的是你不断获得相同的子字符串,这将是字符串的第一个数字:int nextDigit = ninedigitNum.substring(0,1);。此外,您还希望使用int,而不是String;如果需要,你可以从技术上将String转换为int,但问题本身需要一个int。

有两种方法可以实现这一点。我会这样做,通过实现10的幂的mod将给你一个整数的相应数字,但更简单的方法是转换为char数组,然后直接访问。请注意,这里没有错误检查;你必须自己添加。此外,这里有很多“魔术数字”:好的代码通常只有非常少的代码。我会建议在尝试这些问题之前学习更多数据结构;说实话,如果没有阵列和链接列表,你可以做很少的事情。

char[] ISBN = ninedigitNum.toCharArray();

//Process each number
int total = 0;
for(int i=0; i<9; i++){
    int current_int = Integer.parseInt(ISBN[i]);
    total += current_int * (10 - i)
}

//Find value of d1
for(int i=0; i<9; i++){
    if(((total + i) % 11) == 0){
        total += i*100000000;
        break;
    }
}

return total;

一般情况下:使用System.out.println(x);打印输出或使用编译器的调试程序查看处理过程中发生的情况。

答案 1 :(得分:2)

所以, 这是我写的那段代码。我仍然认为它可以提高效率。

public class Problem3 {
    public static String ISBN(String x)
    {
       char[]temp = x.toCharArray();
       int counter = 2;
       int sum = 0;
       int j=0;
       for(int i=8;i>=0;i--)
       {
           sum+= counter*Integer.parseInt(""+temp[i]);
           counter+=1;
       }
       for(j=0;j<10;j++)
       {
           if((sum+j)%11==0)
           {
               break;
           }
       }
       return x+""+j;
    }
public static void main(String args[])    
{
   String a = "020131452"; 
   System.out.println(ISBN(a));

}
}

希望这有帮助。

答案 2 :(得分:2)

这有效:

public static int ISBN(String nineDigitNum){
    int sum = 0;
    for(int i = 0; i<nineDigitNum.length(); i++){
        sum += Integer.parseInt(""+nineDigitNum.charAt(i))*(10-i);
    }
    return (sum%11);
}

另外我相信如果校验和是==到10,它应该返回一个X,所以你可以更改返回类型并在某处添加if语句,或者只是将if语句放在使用此方法的任何地方。

答案 3 :(得分:1)

这是一个没有循环的简短版本,仅使用substring(), charAt() and length()

public static String ISBN(String nineDigits) {
    int chkD = 11 - checkDigit(nineDigits, 0);
    return nineDigits + ((chkD == 10) ? "X" : chkD);
}

public static int checkDigit(String nDsub, int chkD) {
    if (nDsub.length() == 0)
        return 0;
    chkD = ((nDsub.charAt(0) - '0') * (nDsub.length() + 1));
    return (chkD + checkDigit(nDsub.substring(1), chkD)) % 11;
}

输出:

> ISBN("123456789")
"123456789X"
> ISBN("123456780")
"1234567806"