返回' X'当9位数除以11的总和为10时

时间:2015-08-06 03:17:28

标签: java methods char append symbols

在我的代码中,我希望charSum返回'X'如果余数为10,则9位数的总和除以9.我尝试了charSum = 'X'和{{1}并且都不起作用。算法中的某些东西一定是错的。请帮忙。

charSum = (char) 88

2 个答案:

答案 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);


     }
}

它工作正常:))