题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 99 位数字、11 位识别码和 33 位分隔符,其规定格式如 x-xxx-xxxxx-x
,其中符号 -
就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4
就是一个标准的 ISBN 码。ISBN 码的首位数字表示书籍的出版语言,例如 00 代表英语;第一个分隔符 -
之后的三位数字代表出版社,例如 670670 代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以 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 号码(包括分隔符 -
)。
解题思路
还行不算很难。
直接做就行,我最开始的思路是:先用一个字符数组存放ISBN码。然后要把这个字符数组前11位去掉"-"符号后的数字留下就比如:0-670-82162-4最后一位是识别码,倒数第二位是“-”,我们需要的是067082162
这九位数字。然后用这九位数去乘i即可。进行求和然后模11,判断一下结果是不是等于10,并且判断识别码是否正确。
但是我在进行实际操作的时候还是遇到了问题。
就比如:最开始ISBN码是存放在字符数组里的可是最后进行计算时我要用到的是它的整型数值。
我简单粗暴的在str[i]前面加一个强制类型转换却只是输出其对应的ascii码,最后在网上看到了转换的方法:str[i]-'0';就可以将数字字符转换为数字。
话不多说了,今天状态不是很好,可能有点晚了,脑子不是很清楚,觉得自己并没有讲清楚,就这样先简单总结一下吧。
直接上代码!
源代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main() {
char str[13]; //定义一个字符数组用来存放ISBN码
for (int i = 0; i < 13; i++) { //输入ISBN码
cin >> str[i];
}
int sum = 0;
int a[11] = { 1,0,2,3,4,0,5,6,7,8,9 };
for (int i = 0; i < 11; i++) {
sum += (str[i] - '0') * a[i];
}
if ((sum % 11) != 10) {
if ((str[12] - '0') == (sum % 11)) {
cout << "Right" << endl;
}
else {
for (int i = 0; i < 12; i++) {
cout << str[i];
}
cout << sum % 11 << endl;
}
}
else {
if (str[12] == 'X') {
cout << "Right" << endl;
}
else {
for (int i = 0; i < 12; i++) {
cout << str[i];
}
cout << "X" << endl;
}
}
return 0;
}