ISBN号码

来源:互联网 发布:市政工程造价软件广西 编辑:程序博客网 时间:2024/04/27 20:59

题目描述

每一本正式出版的图书都有一个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】
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;elsea[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;elsecout<<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');elsefprintf(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代替。

校验码的计算方法

  1. 假设某ISBN号码前9位是:7-309-04547;     
  2. 计算加权和S=7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 226;     
  3. 计算S÷11的余数M 226 mod 11 6;     
  4. 计算11-M的差N 11 −    

·   如果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。

  1. 假设某13位ISBN号码前12位是:987-7-309-04547;     
  2. 位置为123-4-567-89(10)(11)(12)     
  3. 计算加权和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;     
  4. 计算S÷10的余数M 117 mod 10 7;     
  5. 计算10-M的差N 10 −     (如果10-M的值为10则校验码取0)
  6. 所以,本书的13位ISBN的校验码是3。


from:
http://blog.csdn.net/pipisorry/article/details/38959031
ref:
ISBN的构成及新旧ISBN校验码的计算方法http://blog.sina.com.cn/s/blog_5cd65b5a0100ecld.html
ISBN编号问题 http://wenku.baidu.com/link?url=qmrPPsRjENp5vUNG-wfwdYYG20lCqr3oC5-jLgfVLksVCopMgIcnONlXmI56p8aHJ3L0W94gWD5o3MfMD0vi9TkC5rMyzT6pSqsv-rqQXcm

2 1
原创粉丝点击