题目描述

ISBN号码由9个数字字符和一位校验字符组成,校验字符可以是数字或大写字母X。校验规则如下:

其中 是第 位数字,校验字符的值等于 ,当值为10时用X表示。

给定一个可能正确也可能错误的ISBN号码,需要判断其校验码是否正确。

算法思路

  1. 读取字符串,提取前9位数字和最后一位校验码
  2. 按公式计算前9位的加权和
  3. 计算正确的校验值
  4. 将计算值转换为字符(10对应’X’,其他对应对应数字字符)
  5. 与输入的校验码比较

代码实现

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    string s;
    cin >> s;
    int sum = 0;
    for(int i = 0; i < 9; i++){
        sum += (i + 1) * (s[i] - '0');
    }
    int correct = (11 - (sum % 11)) % 11;
    char correctChar;
    if(correct == 10) correctChar = 'X';
    else correctChar = '0' + correct;
    
    if(correctChar == s[9]) cout << "Right" << endl;
    else {
        s[9] = correctChar;
        cout << s << endl;
    }
    return 0;
}

关键点

  • 校验码计算公式:
  • 当计算值为10时,校验字符为’X’
  • 错误时需要输出修正后的完整ISBN号码

参考

  • CCF-CSP认证