提取 ISBN 的九位数字计算加权和模 11,校验或替换识别码。
OJ: noi_openjudge
题目 ID: ch0107-29
难度:入门
标签:字符串模拟数学python
日期: 2026-07-30 23:01
题意
校验 ISBN 最后一位识别码;错误时输出改正后的完整 ISBN。
思路
删除连字符后,前九个字符依次乘权重 X 表示。识别码错误时只替换原串最后一位,可保留三个连字符的位置。
代码
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 长度固定,时间和额外空间复杂度均为
总结
格式串校验时,保留原格式并单独提取参与计算的字符最稳妥。