题目描述:
每一本正式出版的图书都有一个 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;
}
1027






