← 返回题目页

P1055 [NOIP 2008 普及组] ISBN 号码

标程

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    cin >> s;

    // 末位是识别码,不参与加权;剩下的 9 位数字才是要乘权重的
    vector<int> d;
    for (int i = 0; i + 1 < (int)s.size(); i++) {
        if (s[i] != '-') d.push_back(s[i] - '0');
    }

    // 第 i 个数字乘以 i(i 从 1 起),求和
    int sum = 0;
    for (int i = 0; i < 9; i++) {
        sum += d[i] * (i + 1);
    }

    // 识别码 = 加权和 mod 11;余数 10 用大写 X 表示
    int r = sum % 11;
    char check = (r == 10) ? 'X' : char('0' + r);

    if (s.back() == check) {
        cout << "Right" << "\n";
    } else {
        s.back() = check;
        cout << s << "\n";
    }
    return 0;
}

动画演示