【问题标题】:Return 'X' when sum of 9 digits divided by 11 is 10当 9 位数字的总和除以 11 为 10 时返回 'X'
【发布时间】:2015-10-29 00:57:12
【问题描述】:

在我的代码中,如果 9 位数字的总和除以 9 时余数为 10,我希望 charSum 返回 'X'。我尝试了 charSum = 'X'charSum = (char) 88,但都不起作用。我的算法中一定有问题。请帮忙。

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));
        sum = sum + num[i];
    }
    int last = (sum % 11);
    char charSum;
    if (last == 10){
        charSum = 'X';
    } else {
        charSum = (char) (last + 48);
    }
    return charSum;
}

public static String formatISBNWithHyphens(String isbn) {
    // original isbn:       123456789
    // possible new isbn:   1-234-56789-X
    char isbn10 = getCheckSum(isbn);
    String isbn10Str = isbn + Character.toString(isbn10);

//  char[] c = new char[isbn10Str.length()];    *leaving this here for future learning.
    String[] cStr = new String[isbn10Str.length()];
    String isbnStr = "";
    for (int i = 0; i < isbn10Str.length(); i++){
        cStr[i] = Character.toString(isbn10Str.charAt(i));
//      c[i] = isbn10Str.charAt(i);             *leaving this here for future learning.
        if (i == 0 || i == 3 || i == 8 ) {
            cStr[i] += '-';
         }

         isbnStr += cStr[i];
    }
    return isbnStr;
}

【问题讨论】:

    标签: java methods char append symbols


    【解决方案1】:
    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);
    
    
         }
    }
    

    一切正常:)

    【讨论】:

      【解决方案2】:

      它工作正常。如果我用933456789 运行它(总和是54,所以54 % 11 = 10),getCheckSum() 方法会按预期返回X

      但是,这似乎不是计算 ISBN-10 校验和的正确方法。根据Wikipedia

      国际 ISBN 官方手册 2001 年版 机构表示,ISBN-10 校验位 - 这是 十位 ISBN – 必须在 0 到 10 之间(符号 X 用于 10),并且必须是所有十位数字的总和,每个 乘以它的(整数)权重,从 10 降到 1,是 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'
      

      【讨论】:

        猜你喜欢
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多