1 条题解
-
0
题目分析
ISBN 号码的识别码需要根据前9位数字计算得出。计算规则为:每位数字乘以对应的权重(1~9)求和后对11取模。若余数为10,识别码为X,否则为余数对应的数字。程序需要验证输入的识别码是否正确,若不正确则输出修正后的完整ISBN。
解题思路
字符提取:根据固定格式 x-xxx-xxxxx-x,通过格式化输入跳过分隔符,直接提取前9位数字和最后一位识别码。
字符转数字:将字符'0'-'9'转换为对应的整数值(如 '5' → 5)。
计算加权和:前9位数字分别乘以权重1~9,求和后对11取余。
判断识别码:
若余数为10,正确识别码为X;
否则为余数的数字形式。
修正输出:若原识别码错误,重新拼接ISBN字符串并输出。
代码实现
#include <iostream> using namespace std; int main() { int t; char c1, c2, c3, c4, c5, c6, c7, c8, c9, c10; // 跳过分隔符,提取前9位和识别码 scanf("%c%*c%c%c%c%*c%c%c%c%c%c%*c%c", &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8, &c9, &c10); // 字符转数字('0'-'9'→0-9) c1 -= '0'; c2 -= '0'; c3 -= '0'; c4 -= '0'; c5 -= '0'; c6 -= '0'; c7 -= '0'; c8 -= '0'; c9 -= '0'; c10 -= '0'; // 注意:若识别码是'X',此处会得到错误数值,但后续逻辑会修正 // 计算加权和并取模 t = (c1*1 + c2*2 + c3*3 + c4*4 + c5*5 + c6*6 + c7*7 + c8*8 + c9*9) % 11; // 判断识别码是否正确 if (t == c10 || (t == 10 && c10 == ('X' - '0'))) { cout << "Right"; } else if (t == 10) { // 余数为10,输出X printf("%d-%d%d%d-%d%d%d%d%d-X", c1, c2, c3, c4, c5, c6, c7, c8, c9); } else { // 余数为0-9,输出对应数字 printf("%d-%d%d%d-%d%d%d%d%d-%d", c1, c2, c3, c4, c5, c6, c7, c8, c9, t); } return 0; }代码解析
字符提取:
scanf 的格式字符串 %c%*c%c%c%c%*c%c%c%c%c%c%*c%c 表示:
读取第1个字符,跳过第2个字符(分隔符-);
读取第3~5个字符(出版社部分),跳过第6个字符;
读取第7~11个字符(书号部分),跳过第12个字符;
读取第13个字符(识别码)。
例如,输入 0-670-82162-4 时,c1='0',c2='6',c3='7',依此类推。
字符转数字:
通过 c -= '0' 将字符转换为对应的整数值(如 '3' → 3)。
注意:若识别码是'X',此处会转换为 88 - 48 = 40,但后续条件判断会正确处理。
加权和计算:
前9位数字依次乘以权重1~9,求和后对11取余。
例如,输入 0-670-82162-4 时,计算过程为:
0*1 + 6*2 + 7*3 + 0*4 + 8*5 + 2*6 + 1*7 + 6*8 + 2*9 = 158158 % 11 = 4 → 识别码应为4。
识别码判断:
t == c10:直接比较余数与转换后的识别码(适用于数字识别码)。
t == 10 && c10 == ('X' - '0'):处理余数为10且识别码为'X'的情况。
若识别码错误,按格式重新拼接字符串输出。
示例验证
输入 0-670-82162-4:计算余数为4,识别码正确,输出Right。
输入 0-670-82162-X:计算余数为4,识别码错误,输出0-670-82162-4。
输入 1-234-56789-3:若余数为10,输出1-234-56789-X。
- 1
信息
- ID
- 160
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 10
- 标签
- 递交数
- 12
- 已通过
- 1
- 上传者