信息学奥赛一本通1942:【08NOIP普及组】ISBN号码

1942:【08NOIP普及组】ISBN号码


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 13176     通过数: 5200

【题目描述】

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

识别码的计算方法如下:

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

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

【输入】

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

【输出】

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

【输入样例】

0-670-82162-4

【输出样例】

Right

【提示】

【输入输出洋例2】

输入:

0-670-82162-0

输出:

0-670-82162-4


思路:

这道题本身应该不难,应该难的是怎么处理读入的数据

scanf ( "%d-%d-%d-%c" , &a , &b , &c , &d1 );

用这一行代码,我们就解决了读入的问题

然后,我们把读入的a、b、c、d都放在一起,变成9位的数字

m = ( a * 1000 + b ) * 100000 + c;

然后循环m的每一位,对每一位进行处理


代码:

#include
using namespace std;
long long i,s,a,b,c,d,m;
char d1;
int main(){
	scanf ( "%d-%d-%d-%c" , &a , &b , &c , &d1 );  //读入 
	if ( d1 == 'X' )
		d = 10;
	else 
		d = d1 - 48;
	m = ( a * 1000 + b ) * 100000 + c;//变成9位数字(long long型) 
	for ( i = 9 ; i >=1  ; i-- ) 
	{
		s += m % 10 * i ;//s为最终的结果,取最末尾的数*i 
		s %= 11; //要取余 
		m /= 10;//去掉最后一位 
	}
	if ( s == d ) //如果s==给出的号码 
		cout << "Right"; //就做对了 
	else 
	{
		cout << a << "-" << b << "-" << c << "-";//否则做错了,输出 
		if ( s == 10 )//如果是10就是x 
			cout << "X";
		else 
			cout << s;//不然直接输出 
	}
	return 0;  
}

你可能感兴趣的:(c++,算法)