洛谷P1055 ISBN号码代码小结

洛谷P1055 ISBN号码 代码小结

题目链接

用到的方法:

for(String newIsbn : Isbn1.split("-"))
Integer.parseInt(newIsbn)

题目描述

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

识别码的计算方法如下:

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

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

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

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

代码总结

  1. String类方法split(“x”)可以将特定的符号x删去并根据符号x的位置将变量分为几段,可用for-each去得到每一段
    String Isbn = cin.nextLine(); for(String newIsbn : Isbn1.split("-"))
  2. 下面代码可将一个的数字字符或全是数字字符的字符串转化为int值
    Integer.parseInt(newIsbn)
  3. 而下列代码则可以将一个字符串中的某段指定位置的子字符串转化为int值
    Integer.parseInt(b.substring(begin,end))或 Integer.parseInt(b.substring(begin))
    第一种可以取任意一段
    第二种只能指定beginindex,从beginindex一直到末尾
    注意如b.substring(0,1)则代表的是String对象b的第一个位置的字符

源代码:

package luogu;

import java.util.Scanner;

public class ISBN号码 {

	//取出String对象中逐个字符转化为int值并根据题目要求计算
	public static int Changeint(int m,int a,String b) {
		if(m == 2) {
			for( int i=0 ; i<b.length() ; i++ ) {
				a = a+Integer.parseInt(b.substring(i,i+1))*(2+i);
			}
		}
		if(m == 3) {
			for( int i=0 ; i<b.length() ; i++ ) {
				a = a+Integer.parseInt(b.substring(i,i+1))*(5+i);
			}
		}
		return a;
	}
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		String Isbn = cin.nextLine();
		String Isbn1 = Isbn;
		int m = 1;
		int num = 0;
		int num4 = 0;
			
		for(String newIsbn : Isbn1.split("-")) {		//Isbn.split("-")去掉ISBN码中的“-”号,并将其分为四段String对象
			if(m == 1) {
				num = Integer.parseInt(newIsbn);	//将第一段String对象转化为一个int值
				m++;
				continue;
			}
			if(m == 2 || m==3) {
				num = Changeint(m,num,newIsbn);
				m++;
				continue;
			}
			if(m == 4) {
				if(newIsbn.endsWith("X"))
					num4 = 10;
				else
					num4 = Integer.parseInt(newIsbn);
			}
		}
		
		num %= 11;
		m = 1;
		if(num == num4)
			System.out.print("Right");
		else {
			for(String newIsbn : Isbn.split("-")) {		//Isbn.split("-")去掉ISBN码中的“-”号,并将其分为四段String对象
				if(m < 4) {
					System.out.print(newIsbn+'-');
					m++;
				}
				else {
					if(num == 10)
						System.out.print('X');
					else
						System.out.print(num);
				}
			}
		}
	}
}


//String replace(char oldChar, char newChar)
//返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

//char[] toCharArray()
//将此字符串转换为一个新的字符数组。

你可能感兴趣的:(洛谷P1055 ISBN号码代码小结)