洛谷P1055 [NOIP 2008 普及组] ISBN 号码 解析

题目描述:

每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如 x-xxx-xxxxx-x,其中符号 - 就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 0 代表英语;第一个分隔符 - 之后的三位数字代表出版社,例如 670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以 1 加上次位数字乘以 2 ……以此类推,用所得的结果 mod11,所得的余数即为识别码,如果余数为 10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162 这 9 个数字,从左至右,分别乘以 1,2,…,9 再求和,即 0×1+6×2+……+2×9=158,然后取 158mod11 的结果 4 作为识别码。

你的任务是编写程序判断输入的 ISBN 号码中识别码是否正确,如果正确,则仅输出 Right;如果错误,则输出你认为是正确的 ISBN 号码。

思路:

首先要将ISBN号码输入,在此可以使用字符+数字、字符数组、字符串等完成输入。

接着计算识别码。使用字符串获字符数组时需注意:此时的‘1’‘2’等数字实际上是字符,所代表的ASCII码并不是真正所代表的数字,需要将他们转换成相应的数字,例如用该字符-‘0’。

最后是判断识别码是否正确。在此要注意‘X’的转换。原有识别码的‘X’相当于10,在输出识别码时也不要忘记将10转换成‘X’。

代码

本题我使用过两种方法,如下:

1.使用字符+数字

#include<iostream>
using namespace std;
int main() {
	int a,b,c,d,g,h,g1,g2,g3,h1,h2,h3,h4,h5,i;
    char e,f;
    cin>>a>>b>>c;
    cin>>e>>f;
    if(f<65){
    	d=f-48;
    }else{
        d=f-78;
    }
	g=b*(-1);
    h=c*(-1);
    g1=g/100;
    g2=g/10%10;
    g3=g%10;
    h1=h/10000;
    h2=h/1000%10;
    h3=h/100%10;
    h4=h/10%10;
    h5=h%10;
    i=(a+2*g1+3*g2+4*g3+5*h1+6*h2+7*h3+8*h4+9*h5)%11;
    if(i==d){
        cout<<"Right"<<endl;
    }else{
        if(i<10){
            cout<<a<<b<<c<<"-"<<i<<endl;
        }else{
            cout<<a<<b<<c<<"-X"<<endl;
        }
        
    }
     return 0;
}

2.使用字符串

#include<bits/stdc++.h>
using namespace std;
string a;
int b,c;
int main(){
    cin>>a;
    b=(a[0]-'0')*1+(a[2]-'0')*2+(a[3]-'0')*3+(a[4]-'0')*4+(a[6]-'0')*5+(a[7]-'0')*6+(a[8]-'0')*7+(a[9]-'0')*8+(a[10]-'0')*9;
    b=b%11;
    if(a[12]=='X')c=10;
    else c=(a[12]-'0');
    if(c==b)cout<<"Right";
    else{
        a.erase(12,1);
        cout<<a;
        if(b==10)cout<<'X';
        else cout<<b;
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值