1 条题解

  • 0
    @ 2025-3-8 16:29:48

    题目分析

    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 = 158
    

    158 % 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
    上传者