Java洛谷P1055 ISBN号码

题目链接:https://www.luogu.com.cn/problem/P1055
Java洛谷P1055 ISBN号码_第1张图片

输入格式

一个字符序列,表示一本书的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计算,看下面的图你就懂了
Java洛谷P1055 ISBN号码_第2张图片

所以,我们来说上面这行代码:

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

相减之后就得到了相应的结果

你可能感兴趣的:(洛谷)