【CCF CSP-20131202】ISBN 号码
题意概述
每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如x-xxx-xxxxx-x
,其中符号-
是分隔符(键盘上的减号),最后一位是识别码。识别码的计算方法如下:
首位数字乘以 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 号码(包括分隔符-
)。
C++代码
#include <bits/stdc++.h>
using namespace std;
using gg = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string si;
cin >> si;
gg num = 1, s = 0;
for (gg i = 0; i < si.size() - 1; ++i) {
if (isdigit(si[i])) {
s += (si[i] - '0') * (num++);
}
}
char c = s % 11 == 10 ? 'X' : s % 11 + '0';
if (si.back() == c) {
cout << "Right\n";
} else {
si.back() = c;
cout << si;
}
return 0;
}