ZeroJudge D103: ISBN號碼

每一本正式出版的圖書都有一個 ISBN 號碼與之對應,ISBN 碼包括 9 位數字、1 位識別碼和 3 位分隔符,其規定格式如「x-xxx-xxxxx-x」,其中符號「-」是分隔符號 (鍵盤上的減號),最後一位是識別碼,例如 0-670-82162-4 就是一個標準的 ISBN 碼。 ISBN 碼的首位數字表示書籍的出版語言,例如 0 代表英文;第一個分隔符號「-」之後的三位數字代表出版社,例如 670 代表維京出版社;第二個分隔之後的五位數字代表該書在出版社的編號;最後一位為識別碼。

識別碼的計算方法如下:
首位數字乘以 1 加上次位數字乘以 2 … 以此類推,用所得的結果 mod 11,所得的餘數即為識別碼,若餘數為 10,則識別碼為大寫字母 X。

例如 ISBN 號碼 0-670-82162-4 中的識別碼 4 是這樣得到的:對 067082162 這9個數字,從左到右,分別乘以 1,2,…,9,再求和,即 0 × 1 + 6 × 2 + …… + 2 × 9 = 158,然後取 158 mod 11 的結果 4 作為識別碼。

你的任務是編寫程式判斷輸入的 ISBN 號碼中識別碼是否正確,如果正確,則僅輸出「Right」;如果錯誤,則輸出你認為是正確的 ISBN 號碼。

範例測資

範例輸入範例輸出
EOF 輸入,每一行是一個字元序列,表示一本書的 ISBN 號碼(保證輸入符合ISBN號碼的格式要求)。假如輸入的 ISBN 號碼的識別碼正確,那麼輸出「Right」,否則,按照規定的格式,輸出正確的ISBN號碼 (包括分隔符號「-」)。
0-670-82162-4
0-670-82162-0
Right
0-670-82162-4

解題思路

使用 For迴圈 將減號排除,並且判斷認證碼為何,如果驗證碼和字串最後一個字元相同,則輸出「Right」,如果不相同則將最後一個字元改成正確的驗證碼並輸出字串。

範例程式碼-ZeroJudge D103: ISBN號碼

#include <iostream>
using namespace std;

int main() {
    string str;
    while (cin >> str)
    {
        string num = "";
        int sum = 0;
        string output = "";
        for (int i = 0; i<str.length()-1; i++)
        {
            if (str[i] != '-') num += str[i];
            output += str[i];
        }
        for (int i = 0; i<num.length(); i++)
        {
            sum += int(num[i] - '0') * (i+1);
        }
        string ans;
        if (sum % 11 < 10) ans = to_string(sum % 11);
        else ans = "X";
        if (ans[0] == str[str.length()-1]) cout << "Right\n";
        else cout << output << ans << "\n";
    }
}

//ZeroJudge D103
//Dr. SeanXD

發佈留言