0

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

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

   ...
}

校验和(来源:普林斯顿大学)。国际标准书号 (ISBN) 是一个 10 位代码,用于唯一指定一本书。最右边的数字是校验和数字,可以从其他 9 位数字中唯一确定,条件是 d1 + 2d2 + 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 号。

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

4

4 回答 4

2

它不起作用怎么办?无论哪种方式,我相信您缺少的是您不断获得相同的子字符串,这将是字符串的第一个数字:int nextDigit = ninedigitNum.substring(0,1);。此外,您将要使用 a int,而不是 a 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);或使用编译器的调试器来查看处理过程中发生了什么。

于 2013-12-09T19:07:27.600 回答
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 语句放在使用此方法的任何地方。

于 2013-12-09T20:26:18.450 回答
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));

}
}

希望这可以帮助。

于 2013-12-09T20:24:15.133 回答
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"
于 2013-12-10T00:00:00.243 回答