识别码的计算方法如下:
首位数字乘以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号码(包括分隔符“-”)。 样例输入 0-670-82162-4 样例输出 Right 样例输入 0-670-82162-0 样例输出 0-670-82162-4 答案内容有诸多函数之前没有用过,包括一些JavaScript方法,掌握这些方法简便很多。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main2 {
public static void main(String[] args) {
BufferedReader bin=new BufferedReader(new InputStreamReader(System.in));
//1. java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
<span style="font-family: Arial, Helvetica, sans-serif;"> //2. 从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。</span>
//3. System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。try {int sum=0;char cc='0';String isbn_0=bin.readLine();String isbn=isbn_0.replace("-","");//replace()可以替换字符串,在这里将“-”去掉便于后面计算</span>for(int i=0;i<9;i++){int ii=(int)isbn.charAt(i)-48;//charAt(i)表示第i个字符的值,"0"的Ascll码为48sum +=ii*(i+1);}sum=sum%11;if(sum==0) cc='X';else cc=(char)(sum+48);if(cc==isbn.charAt(9)) System.out.println("Right");else{isbn_0=isbn_0.substring(0, 12)+cc;//substring() 方法用于提取字符串中介于两个指定下标之间的字符</span>System.out.println(isbn_0);}} catch (IOException e) {e.printStackTrace();}}}