每一本正式出版的圖書都有一個 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