常见的手机网站,苏州网站建设优化公司,seo 新老网站替换 域名不变,网站平台方案1.题目描述
每一本正式出版的图书都有一个 ISBN 号码与之对应#xff0c;ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符#xff0c;其规定格式如 “x-xxx-xxxxx-x”#xff0c;其中符号“-”是分隔符#xff08;键盘上的减号#xff09;#xff0c;最后一位是识别码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 个数字从左至右分别乘以 12…9再求和即 0×16×2……2×9158然后取 158 mod 11 的结果 4 作为识别码。 你的任务是编写程序判断输入的ISBN号码中识别码是否正确如果正确则仅输出 Right如果错误则输出你认为是正确的 ISBN 号码。
输入描述
输入一行是一个字符序列表示一本书的 ISBN 号码保证输入符合 ISBN 号码的格式要求。
输出描述
输出一行假如输入的 ISBN 号码的识别码正确那么输出Right否则按照规定的格式输出正确的 ISBN 号码包括分隔符“-”。
输入输出样例
示例 1 输入 0-670-82162-4输出 Right示例 2 输入 0-670-82162-0输出 运行限制
最大运行时间1s最大运行内存: 128M
2.代码
#include iostream
#includestring
using namespace std;
int main()
{string s;getline(cin,s);//输入int sum0;int j1;for(int i0;i10;i)//求和{if(s[i]!-){sum(s[i]-0)*j;j;}}int asum%11;//取模if(a10)//如果a10,要变为‘X’{aX;}else//其他情况下,变为字符串类型方便后续操作{aa0;}if(as[12])//判断并输出结果{coutRightendl;}else {s[12]a;coutsendl;}return 0;
}
3.代码解析
输入部分
string s;
getline(cin, s); 使用 getline 从标准输入读取一行字符串存储到变量 s 中。这允许输入包含空格的字符串但在这个场景下输入应该是一个13位的字符串前12位是数字第13位是校验码。
初始化变量
int sum 0;
int j 1;
int flag 1; sum 用于存储加权和。 j 用于表示权重从1开始递增。
计算加权和
for (int i 0; i 10; i) {if (s[i] ! -) {sum (s[i] - 0) * j;j;}
} 遍历字符串的前11个字符索引从0到10。 如果字符不是 -则将其转换为数字s[i] - 0乘以当前权重 j并累加到 sum 中。 权重 j 每次递增1。
计算校验码
cpp复制
int a sum % 11;
if (a 10) {a X;
} else {a a 0;
} 计算加权和 sum 对11取模的结果。 如果结果是10则校验码为 X。 否则将结果转换为字符a 0。
验证校验码
if (a s[12]) {cout Right endl;
} else {s[12] a;cout s endl;
} 如果计算出的校验码 a 与输入字符串的第13个字符索引为12相同则输出 Right。 否则将计算出的校验码赋值给字符串的第13个字符并输出修正后的字符串。