首页 > 代码库 > ISBN号码

ISBN号码

题目描述

每一本正式出版的图书都有一个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;
			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代替。

校验码的计算方法

  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

ISBN号码