这个问题让我感到困惑。我尝试使用这样的循环:基本上我试图从输入中获取第一个数字并执行公式,但它似乎不起作用。它看起来很简单,但我无法弄清楚。你可以帮帮我吗?感谢。
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测试 案例来测试你的方法。
我明白了,非常感谢大家!
答案 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"