一、描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
识别码的计算方法如下:首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
二、格式
- 输入格式
输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 - 输出格式
输出共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。
三、思路
将ISBN码中的数字取出来存为一个字符串或int数组,取前9位进行计算,结果与第10位进行比对,验证结果是否正确。需要注意的点:
- int 和 char 之间不能直接转换(char直接转换未int,得到是ASCII码值),可以使用Character.getNumericValue(char)方法进行转换;或者将char存入char[],在将char[] toString()得到一个字符串,然后再Integer.parseInt。
- 识别码为'X'时的 识别码存入字符串或数组、计算结果与识别码的对比、给出正确的ISBN码 等相关情况。
四、代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String number = sc.next();
//将数字部分存为一个新字符串
String[] items = number.split("-");
String target = "";
for(int i =0;i<items.length;i++){
target += items[i];
}
//计算取得结果
int result = 0;
for(int i = 1;i<target.length();i++){
char tmp = target.charAt(i-1);
int ctmp = Character.getNumericValue(tmp);
result += ctmp*i;
}
//计算出标识码 并判断是不是 'X'
int sbm = (result%11)==10?10:(result%11);
//获取输入的ISBN的标识码,并判断是不是'X'
char ch = number.charAt(number.length()-1);
int s = ch == 'X'?10:Character.getNumericValue(ch);
//验证 标识码是否正确
if(sbm == s){
System.out.println("Right");
}else{
number = number.substring(0,number.length()-1);
if(sbm==10){
number += 'X';
} else{
number += sbm;
}
System.out.println(number);
}
}
}