Java 洛谷 P1055 ISBN号码

题目链接: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

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

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值