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<bits/stdc++.h>
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;
}