今天带着大家练手一道蓝桥杯题目
题目内容:
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xXX-XXXxx-x”,其中符号"-"是分隔符(键盘上的减号),最后一位是识别码,例如O-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如O代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2......以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母×。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即:Ox1+6×2+......+2×9=158,然后取158 mod 11的结果4作为识别码。你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如”确,则仅输出Right;如果错误,则输出你认是正确的ISBN号码。
解题思路:
一.创建Scanner类型对象,从控制台读取到输入的ISBN号码 二.去除号码中所有的“-”,即取出号码中所有数字 三.用最后一位数字(即识别码)以外的所有号码算出当前号码的识别码,具体操作如下
1.设置一个累加器sum为0
2.使用for循环遍历所有识别码前的号码,定义两个初始变量,i=0,k=1,在每次循环中加1,即可拿出号码的每一个和1-9分别相乘,然后用sum累加所有相乘后的数字
https://blog.csdn.net/2401_82742105/article/details/135969262
注意:拿出号码每一个时需要转换为Integer类型,才可做算数运算三.根据累加值算识别码
1.算出的识别码要做一个判断,若等于10,识别码为“X”,若不等于10,则算出的值即为识别码
四.获取原始号码最后一位(即原始输入的识别码)
五.判断:若计算出的识别码与原始识别码相等则输出Right,若不相等则将计算出的正确的识别码和系统输入的除最后一位的号码拼接,再做输出(输出的即正确的ISBN号码)
public static void main(String[] args) {
//通过Scanner类从控制台读取用户输入的ISBN号码
try(Scanner input=new Scanner(System.in)){
String isbn=input.next();
//去除出版编号中的所有“-”
String isbnstr=isbn.replace("-","");
//遍历除效验码(最后一位)以外的所有字符,并累加求和
int sum=0;
for(int i=0,k=1;i<isbnstr.length()-1;i++,k++) {
int n=Integer.parseInt(String.valueOf(isbnstr.charAt(i)));
sum=sum+(n*k);
}
//根据累加值,计算效验码
String validateCode=String.valueOf(sum%11==10?"X":String.valueOf(sum%11));
//获取原始的效验码
String last=String.valueOf(isbnstr.charAt(isbnstr.length()-1));
//判断:如果计算的累加值与原始效验码相同输出 Right
//不同则输出计算出的正确的号码
if(validateCode.equals(last)) {
System.out.println("Right");
}else {
System.out.println(isbn.substring(0,isbn.length()-1)+validateCode);
}
}
}