ISBN号码

GitHub跳转原题关系图返回列表

提取 ISBN 的九位数字计算加权和模 11,校验或替换识别码。

OJ: noi_openjudge

题目 ID: ch0107-29

难度:入门

标签:字符串模拟数学python

日期: 2026-07-30 23:01

题意

校验 ISBN 最后一位识别码;错误时输出改正后的完整 ISBN。

思路

删除连字符后,前九个字符依次乘权重 1199 并取模 1111。余数 1010X 表示。识别码错误时只替换原串最后一位,可保留三个连字符的位置。

代码

Python代码

python
isbn = input().strip()
digits = [character for character in isbn if character != "-"]
checksum = sum(int(digit) * weight for weight, digit in enumerate(digits[:9], 1)) % 11
expected = "X" if checksum == 10 else str(checksum)

if digits[9] == expected:
    print("Right")
else:
    print(isbn[:-1] + expected)

C++代码

cpp
#include <cstdio>
#include <cstring>

char str[500];
int sum = 0;
int main(){
    scanf("%s",str+1);

    sum += (str[1] -'0')*1;
    sum += (str[3] -'0')*2;
    sum += (str[4] -'0')*3;
    sum += (str[5] -'0')*4;
    sum += (str[7] -'0')*5;
    sum += (str[8] -'0')*6;
    sum += (str[9] -'0')*7;
    sum += (str[10] -'0')*8;
    sum += (str[11] -'0')*9;

    int ans =sum % 11;
    if ( ans == str[13] - '0')
        printf("Right");
    else if( ans == 10 && str[13] == 'X')
        printf("Right");
    else {
        if(ans == 10)
            str[13] = 'X';
        else
            str[13] = ans+'0';
        printf("%s",str+1);
    }

    return 0;
}

复杂度

ISBN 长度固定,时间和额外空间复杂度均为 O(1)O(1)

总结

格式串校验时,保留原格式并单独提取参与计算的字符最稳妥。