【Java】P1055 ISBN号码—方法:split && Integer.parseInt && equals—(OJ:洛谷)

链接:https://www.luogu.org/problem/P1055
来源:洛谷

时间限制:1.00s
内存限制:125.00MB

题目描述

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母XX。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9再求和,即0×1+6×2+……+2×9=158,然后取158mod11的结果4作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。

输入格式

一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出格式

一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。

输入输出样例
输入 #1

0-670-82162-4

输出 #1

Right

输入 #2

0-670-82162-0

输出 #2

0-670-82162-4

说明/提示

2008普及组第一题

思路

先用split将输入的字符串转化为数组

	String sn = sc.nextLine();
	String[] ss = sn.split("");

你就会得到一个长度为13的字符串数组(以#1样例为例)

	[0, -, 6, 7, 0, -, 8, 2, 1, 6, 2, -, 4]

通过Integer.parseInt+ for循环相乘相加,可以通过判断字符数组中是否是“-”或判断i==1||i==5将数组中的非数字排除,这里采用的是判断i的值

	int k = 1;
	int sum = 0;
	for(int i=0; i<11; i++) {
		if(i==1||i==5) {
			continue;
		}
		sum += Integer.parseInt(ss[i]) * k;
		k++;
	}

注意:字符判断需要使用equals,而不是==,这一点会在后面的方法中讲到

然后判断得到的数是否是数组中的最后一位,就可以得出结果了

方法:split && Integer.parseInt && equals

关于split && Integer.parseInt,我之前的一篇博客里面讲的很详细了,这里就不多赘述了,想了解这两个方法的可以移步

【Java】小乐乐定闹钟—方法:split && Integer.parseInt—(OJ:牛客-哈理工新生赛/1877第M题)

这里主要讲讲equals,这个折磨我好久的String方法,
在别的地方判断是否等于,一般会用“==”
但是在String中“==”是用来判断这两个字符串对象是否指向同一个字符串,
equals才是判断这两个字符串里面的值是否相等。

		String str1 = "abc";
		String str2 = "abc";	
		String str3 = new String("abc");
		System.out.println(str1 == str2);	//true	//str1与sre2指向同一个字符串
		System.out.println(str1 == str3);	//flase	//str3为new String,指向与str1不同
		System.out.println(str1.equals(str3));	//true	//指向不同,但是内容是一样的

Java源代码

package 新手村;

import java.util.Scanner;

/**
 *@Title P1055ISBN号码.java
 *@description TODO
 *@time 2019年11月22日
 *@author Baisu
 *@version 1.0
 */
public class P1055ISBN号码 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String sn = sc.nextLine();	//输入字符串
		String[] ss = sn.split("");	//转为数组
		int k = 1;
		int sum = 0;
		for(int i=0; i<11; i++) {
			if(i==1||i==5) {	//排除“-”
				continue;
			}
			sum += Integer.parseInt(ss[i]) * k;	//累加
			k++;
		}
		int validation = sum % 11;	//mod11
		if(ss[12].equals("X")) {	//判断ss[12]是否是“X”
			if(validation==10) {	//判断validation的值
				System.out.println("Right");
			}
			else {
				for(int i=0; i<12; i++) {
					System.out.print(ss[i]+"");
				}
				System.out.println(validation);
			}
		}
		else {
			if(validation==Integer.parseInt(ss[12])) {
				System.out.println("Right");
			}
			else {
				for(int i=0; i<12; i++) {
					System.out.print(ss[i]+"");
				}
				if(validation==10) {	//如果validation是10,需输出“X”
					System.out.println("X");
				}
				else {
					System.out.println(validation);
				}
			}
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值