每一本正式出版的图书都有一个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号码(包括分隔符“-”)。
0-670-82162-4
【输入样例2】
0-670-82162-0
【输出样例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;
}
code3:
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位数字组成,并以三条线段加以分割,每组数字都有不同的含义。
第一组:区位代码
第二组:出版社代码
第三组:书序码
第四组:计算机校验码
校验码的计算方法
- 假设某ISBN号码前9位是:7-309-04547;
- 计算加权和S=7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2
= 226; - 计算S÷11的余数M
= 226 mod 11 = 6; - 计算11-M的差N
= 11 − 6 = 5
·
·
·
所以,本书的校验码是5。
ISBN中心于2004年决定在ISBN的基础上再添加一组三位数字在最前,即將现有的10位书号前面加上“978”及重新计算稽核号,以转换为新的13位格式
- 注释
13位ISBN的最后一位校验位的加权算法与10位ISBN的算法不同。具体算法是:用1分别乘ISBN的前12位中的奇数位,用3乘以偶数位,成绩之和以10为模,用10减去此模,即可得到校验位的值,其值范围应该为0-9。
- 假设某13位ISBN号码前12位是:987-7-309-04547;
- 位置为123-4-567-89(10)(11)(12)
- 计算加权和S=9×1+8×3+7×1+7×3+3×1+0×3+9×1+0×3+4×1+5×3+4×1+7×3
= 117; - 计算S÷10的余数M
= 117 mod 10 = 7; - 计算10-M的差N
= 10 − 7 = 3 (如果10-M的值为10则校验码取0) - 所以,本书的13位ISBN的校验码是3。