题目链接:https://www.luogu.com.cn/problem/P1055
输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。
输入输出样例
输入
0-670-82162-4
输出
Right
输入
0-670-82162-0
输出
0-670-82162-4
说明/提示
2008普及组第一题
代码实例:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//首先输入一个字符串,例:0-670-82162-4
String a = scanner.next();
//看题意:sum代表从首位数乘起*1*2*3*4...一直乘到9之和;count就是计数器从1-9
int sum = 0,count = 1;
//这里定义mod的意义是:不用再写判断,当余数等于10的时候,识别码为大写字母X,直接获取mod[sum%11],如果sum%11 = 10,那么mod[10]='X'
char mod[] = new char[]{'0','1','2','3','4','5','6','7','8','9','X'};
for (int i = 0; i < a.length()-1; i++) {
if(a.charAt(i) == '-') {
//continue不懂的上百度搜索,这里简单说一下,如果说遍历到分隔符'-'的话,就结束本次循环,下面的语句都不执行,而执行下一次循环
continue;
}
//这里就是计算sum值
//a.charAt(i) - '0',这段代码在下面详细解释
sum += (a.charAt(i) - '0')*count++;
}
if(mod[sum%11]==a.charAt(a.length()-1)) {
System.out.println("Right");
}else {
for (int i = 0; i < a.length(); i++) {
if(i==a.length()-1) {
System.out.print(mod[sum%11]);
}else {
System.out.print(a.charAt(i));
}
}
}
scanner.close();
}
}
代码详解
sum += (a.charAt(i) - '0')*count++;
上面这行代码中是怎么得到sum=158呢?
首先我们了解一下charAt()这个函数
charAt()方法从一个字符串中返回指定的字符的值
例如:
public class Main{
public static void main(String[] args) {
String a = "abc123";
System.out.println(a.charAt(0));
}
}
输出
a
public class luogu1_5_1055_2 {
public static void main(String[] args) {
String a = "abc123";
System.out.println(a.charAt(3));
}
}
输出
1
注意:此时并不会输出其ACSLL码值
当执行一下代码的时候:
public class Main{
public static void main(String[] args) {
String a = "abc123";
int sum = (a.charAt(0) + a.charAt(1));
System.out.println(sum);
}
}
输出
195//这个就是'a'的ACSLL值97+'b'的ACSLL值98=195
知识点:当执行加法运算的时候,由于返回的类型是int类型,java自动将低位的数据类型转换为高位的数据类型,本题就是将char类型转化为int计算,看下面的图你就懂了
所以,我们来说上面这行代码:
sum += (a.charAt(i) - '0')*count++;
'0’的ACSLL值为48=
每次取出来的a.charAt(i)分别为:
‘0’,‘6’,‘7’,‘0’,‘8’,‘2’,‘1’,‘6’,‘2’
对应的ACSLL值为:
== 48,54,55,48,56,50,54,50
相减之后就得到了相应的结果