CCF历程 201312-2 ISBN号码 -Java
试题编号: | 201312-2 |
---|---|
试题名称: | ISBN号码 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题简述: | 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。 识别码的计算方法如下: 首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。 编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出是正确的ISBN号码。 |
输入 | 输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。 |
输出 | 输出一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”)。 |
样例输入1 | 0-670-82162-4 |
样例输出1 | Right |
样例输入2 | 0-670-82162-0 |
样例输出2 | 0-670-82162-4 |
分析
- 输入字符串长度固定,输入格式明确。
- 特殊符号‘-’位置固定。
- 计算方式明确。
- 输出格式固定。
代码
public static void main(String[] args){
int []num = new int[13];
int temp =0,code = 0;
System.out.println("请输入ISBN号码:");
Scanner scan = new Scanner(System.in);
String str = scan.next();
for(int i=0;i<str.length();i++){
temp++;
if(i==1||i==5||i==11){
temp --;
continue;
}
num[i]= Integer.parseInt(str.charAt(i)+"");
if(i!=12){
code += temp*num[i];
}
}
code = code%11;
if(code ==num[12]){
System.out.println("Right");
}else{
System.out.println(str.substring(0,12)+code);
}
}
编程思路:
- 有输入就先搞个Scanner。
Scanner scan = new Scanner(System.in);
String str = scan.next();
- ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,既然格式固定就先把9位数字、1位识别码提取转换为int类型。
- 声明一个与字符串长度相同的数组num,用来存放待计算的数字。
- 字符串中在位置(1、5、11)是特殊符号,就直接跳过忽略。
- 使用字符串对象自带的charAt()方法逐个读取单个字符。
- 使用Integer类的parseInt(String s)方法将字符串转换为数字,已经很明确除特殊符号外都是数字。
- 因为parseInt()的参数是字符串,但charAt()读取的是字符,所以直接加个“”进行隐性转换。
- 如此一来就得到了一个数组,但会存在三个空值。
int []num = new int[13];
for(int i=0;i<str.length();i++){
if(i==1||i==5||i==11){
continue;
}
num[i]= Integer.parseInt(str.charAt(i)+"");
}
- 根据识别码的计算方式。
- 定义两个变量temp(存放位置),code(存放累加结果),初始值都为0。
- 循环开始就是第一个位置,temp就有自加1。
- 但在特殊符号时,temp是不占位的,所以加了后要给他减回来。
- 最后一位是识别码,不参与累计,要过滤掉 i != 12。
- 结果取模
int temp =0,code = 0;
for(int i=0;i<str.length();i++){
temp++;
if(i==1||i==5||i==11){
temp --;
continue;
}
num[i]= Integer.parseInt(str.charAt(i)+"");
if(i!=12){
code += temp*num[i];
}
}
code = code%11;
- 最后输出结果。
- 根据计算的识别码与原来的识别码作比对,判定输出。
- 如果相等,输出"Right"。
- 否则输出正确的ISBN码:截取0到12位的子字符串,拼接正确的识别码。
if(code ==num[12]){
System.out.println("Right");
}else{
System.out.println(str.substring(0,12)+code);
}