zoukankan      html  css  js  c++  java
  • 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
    ");
    	else{ 
    	for(int j = 0; j < 12; j++)
    	fprintf(fp, "%c", input[j]);
    	if( idCode == 10 )
    	fprintf(fp, "%c
    ", 'X');
    	else
    	fprintf(fp, "%d
    ", 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


  • 相关阅读:
    BZOJ4237:稻草人
    BZOJ4009:[HNOI2015]接水果(整体二分版)
    BZOJ3745:[COCI2015]Norma
    BZOJ3110:[ZJOI2013]K大数查询(整体二分版)
    BZOJ2716:[Violet 3]天使玩偶
    BZOJ2527:[POI2011]Meteors
    BZOJ4170:极光
    BZOJ1901:Dynamic Rankings
    Python基础终极实战 基于C/S架构的仿优酷项目
    大白话五种IO模型
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6927344.html
Copyright © 2011-2022 走看看