每一本正式出版的图书都有一个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是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2.,……,9,再求和,即0×1+6×2+……+2×9=158,然后取158 mod 11 的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定格式,输出正确的ISBN号码(包括分隔符“-”)。
【输出样例1】
Right
【输出样例2】
0-670-82162-4
code
code1:
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <deque> #include <list> #include <map> using namespace std; int a[10]; int main() { string s; cin >> s; a[0] = s[0] - '0'; a[1] = s[2] - '0'; a[2] = s[3] - '0'; a[3] = s[4] - '0'; a[4] = s[6] - '0'; a[5] = s[7] - '0'; a[6] = s[8] - '0'; a[7] = s[9] - '0'; a[8] = s[10] - '0'; a[9] = s[12] - '0'; int sum = 0; for (int i = 0, j = 1; i < 9; i++, j++) { sum += a[i] * j; } int code = sum % 11; char c = code == 10 ? 'X' : '0' + code; if (s[12] == c) { cout << "Right" << endl; }else { s[12] = c; cout << s << endl; } return 0; }
code2:
#include<iostream> #include<algorithm> #include<string> #include<cstring> using namespace std; int main() { string str1; int len=13; int z,i,sum,now; sum=0; now=0; z=0; cin >>str1; for (i=0; i<len; i++) { if (str1[i]!='-') { now=str1[i]-'0'; z++; if (i!=len-1) sum=sum+z*now; } } if (str1[len-1]=='X') now=10; else now=str1[len-1]-'0'; if (sum%11==now) cout <<"Right"<<endl; else { sum=sum%11; for (i=0; i<len-1; i++) cout <<str1[i]; if (sum!=10) cout <<sum<<endl; else cout <<"X"<<endl; } return 0; }
vector<char> ISBN_to_count(char *p) { vector<char> output; vector<int> input; int special=0,i,j,k; char c; k=strlen(p); if(k < 13) { cout<<"it's wrong!"<<endl; output.push_back('w'); return output; } for(i=0; i<12; i++) { c=p[i]; if(c=='-') output.push_back('-'); else { j=c-'0'; input.push_back(j); output.push_back(c); } } c=p[12]; for(i=0; i<input.size(); i++) special+=input[i]*(i+1); special=special%11; if(special+'0'==c) { output.clear(); output.push_back('R'); output.push_back('i'); output.push_back('g'); output.push_back('h'); output.push_back('t'); return output; } if(special==10) output.push_back('X'); else output.push_back(special+'0'); return output; }
code4:
/****************************************************************************/ /*<span style="white-space:pre"> </span>CCF软件能力认证考试模拟题/bjfu - 1158 —— ISBN号码 皮皮 2014-8-31 */ /****************************************************************************/ #include <iostream> using namespace std; void ISBN(){ //freopen("isbn.in", "r", stdin); //FILE *fp = fopen("isbn.out", "w"); int a[13]; char c; char input[14]; for(int i = 0, j = 0; i < 10; j++){ cin >> c; input[j] = c; if( c != '-' ){ if( c == 'X') a[i] = 10; else a[i] = c - '0'; i++; } } int sum = 0; for(int i = 0; i < 9; i++){ a[i] *= i+1; sum += a[i]; } int idCode = sum % 11; if( idCode == a[9] ) cout<< "Right"<<endl; else{ for(int j = 0; j < 12; j++) cout<<input[j]; if( idCode == 10 ) cout<<"X"<<endl; //cout<<'X'<<endl; else cout<<idCode<<endl; } /*if( idCode == a[9] ) fprintf(fp, "%s", "Right\n"); else{ for(int j = 0; j < 12; j++) fprintf(fp, "%c", input[j]); if( idCode == 10 ) fprintf(fp, "%c\n", 'X'); else fprintf(fp, "%d\n", idCode); } */ //fclose(fp); //fclose(stdin); } int main(){ ISBN(); return 0; }
注意:
输入最后一个字符可能是X
附:
ISBN的构成及新旧ISBN校验码的计算方法
ISBN号码由10位数字组成,并以三条线段加以分割,每组数字都有不同的含义。
第一组:区位代码 0,1:英文 2:法文 3:德文 4:日文 5:俄文 7:中文
第二组:出版社代码 由各国的ISBN码分配中心,分给各个出版社。
第三组:书序码 该出版物代码,由出版社具体给出
第四组:计算机校验码 只有一位,从0到10,10由X代替。
校验码的计算方法
· 如果N=10,校验码是字母“X”;
· 如果N=11,校验码是数字“0”;
· 如果N为其他数字,校验码是数字N。
所以,本书的校验码是5。
ISBN中心于2004年决定在ISBN的基础上再添加一组三位数字在最前,即將现有的10位书号前面加上“978”及重新计算稽核号,以转换为新的13位格式 。该计划将于2007年实施。
13位ISBN的最后一位校验位的加权算法与10位ISBN的算法不同。具体算法是:用1分别乘ISBN的前12位中的奇数位,用3乘以偶数位,成绩之和以10为模,用10减去此模,即可得到校验位的值,其值范围应该为0-9。