【题目来源】
https://www.luogu.com.cn/problem/P1055
https://www.acwing.com/problem/content/435/
【题目描述】
每一本正式出版的图书都有一个 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
【输出样例1】
Right
【输入样例2】
0-670-82162-0
【输出样例2】
0-670-82162-4
【算法分析】
● 若 x 为数字 0~9 中的一个,'x' 为字符 '0'~'9' 中的一个,则 x 与 'x' 之间具有相互转换的关系。即,x+'0' 得到字符 '0'~'9' 中的一个,'x'-'0' 得到数字 0~9 中的一个。
● 若给定字符串 str,则在下面代码中,for 循环的循序变量 i 的上界为 str.size()-1。这是因为字符串 str 的第 str.size()-1 位的值需要进行计算求得。
【算法代码】
#include <bits/stdc++.h>
using namespace std;
char ch;
int sum;
int main() {
string str;
cin>>str;
for(int i=0, j=1; i<str.size()-1; i++) {
if(str[i]!='-') {
sum+=(str[i]-'0')*j;
j++;
}
}
if(sum%11==10) ch='X';
else ch=sum%11+'0';
int t=str.size()-1;
if(str[t]==ch) cout<<"Right";
else {
str[t]=ch;
cout<<str;
}
return 0;
}
/*
in1:
0-670-82162-4
out1:
Right
in2:
0-670-82162-0
out2:
0-670-82162-4
*/
【参考文献】
https://www.acwing.com/solution/content/90200/
https://www.acwing.com/solution/content/125180/
https://www.acwing.com/solution/content/4078/