问题描述
试题编号: | 201312-2 |
试题名称: | ISBN号码 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。 输入格式 输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 输出格式 输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 样例输入 0-670-82162-4 样例输出 Right 样例输入 0-670-82162-0 样例输出 0-670-82162-4 |
思路:
这道题主要注意两个问题,一个是字符串转为整数的问题,因为字符串是ASCII码直接转为整数比原先的数大48,例如
char a = "0";
int b = (int)a; //此时b的值为48
所以将字符中的数转为整数有两种方法,一种是将转过来的值减去48,如
//一种是将转换过来的值减去48,如
char a = "0";
int b = (int)a - 48; //此时b的值为0
//另一种是-‘0’,如
char a = "0";
int b = a - '0'; //此时b的值为0
另一个要注意的问题是题目要求中的如果余数为10,则识别码为大写字母X。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String isbn = cin.nextLine(); //接收输入的ISBN码
char temp;
int sum=0,time=0; //sum为第一位*1+第二位*2+...+第九位*9
for(int i=0;i<12;i++) {
temp = isbn.charAt(i);
if(temp == '-') {
continue;
}else {
time++;
sum = sum+time*(temp-'0');
}
}
temp = isbn.charAt(12); //temp为识别码
String str;
if(sum%11 == (temp-'0')) { //最后一位刚好是mod11
str="Right";
}else if (sum%11 == 10) { //当mod11 = 10的情况
if(temp == 'X') {
str="Right";
}else {
str = isbn.substring(0, 11)+"-X";
}
}else {
str = isbn.substring(0, 11)+"-"+sum%11;
}
System.out.println(str);
}
}