在我的代码中,我希望charSum
返回'X'
如果余数为10,则9位数的总和除以9.我尝试了charSum = 'X'
和{{1}并且都不起作用。算法中的某些东西一定是错的。请帮忙。
charSum = (char) 88
答案 0 :(得分:3)
工作正常。如果我使用933456789
运行它(其总和为54,因此54%11 = 10),getCheckSum()
方法会按预期返回X
。
然而,这似乎不是计算ISBN-10校验和的正确方法。根据{{3}}:
2001年版国际ISBN官方手册 代理商说ISBN-10校验位 - 这是最后一位数字 十位数的ISBN - 必须介于0到10之间(符号X用于 10),并且必须是所有十个数字的总和,每个 乘以其(整数)权重,从10减1到1,是a 11的倍数。
我按照规范实施了如下:
public static char getCheckDigit(String isbn) {
if (isbn == null || !isbn.matches("[0-9]{9,}")) {
throw new IllegalArgumentException("Illegal ISBN value");
}
int sum = 0;
for (int i = 0; i < 9; i++) {
sum += ((10 - i) * Character.digit(isbn.charAt(i), 10));
}
int check = ((11 - (sum % 11)) % 11);
return check == 10 ? 'X' : Character.forDigit(check, 10);
}
应用于我在同一维基百科页面上找到的几个ISBN值:
getCheckDigit("097522980"); // --> returns 'X'
getCheckDigit("094339604"); // --> returns '2'
getCheckDigit("999215810"); // --> returns '7'
答案 1 :(得分:0)
public class HelloWorld{
public static char getCheckSum(String isbn) {
int sum = 0;
for (int i = 0; i < isbn.length(); i++) {
int[] num = new int[isbn.length()];
num[i] = Character.getNumericValue(isbn.charAt(i));
System.out.println(num[i]);
sum = sum + num[i];
System.out.println(sum);
}
int last = (sum % 11);
char charSum;
if (last == 10){
charSum = 'X';
} else {
charSum = (char) (last + 48);
}
return charSum;
}
public static void main(String []args){
String isbn="123456787";
// possible new isbn: 1-234-56789-X
char isbn10 = getCheckSum(isbn);
System.out.println(isbn10);
}
}
它工作正常:))