問題:ISBN-10 由 10 個數字組成(含連字符)。前 9 位數字加權求和:第 1 位權重 10,第 2 位 9,... 第 9 位權重 2。校驗碼(第 10 位)使總和能被 11 整除。若需補 10,校驗碼為 X。輸入 ISBN 字符串(不含校驗碼),輸出完整 ISBN(含 - 和校驗碼)。
'0'~'9',按順序賦權重 10 遞減至 2 累加。sum % 11:11 - 餘數。X 表示。- + 校驗碼。int calcSum(const string& s) {
int sum = 0, weight = 10;
for (char c : s) {
if (c >= '0' && c <= '9') {
sum += (c - '0') * weight--;
}
}
return sum;
}
int main() {
string isbn;
while (cin >> isbn) {
int sum = calcSum(isbn);
int check = (sum % 11 == 0) ? 0 : 11 - sum % 11;
cout << isbn << '-';
if (check == 10) cout << 'X';
else cout << check;
cout << '\n';
}
return 0;
}
(11 - sum%11) % 11 可統一處理餘數 0 情況(結果 0)。- 和校驗碼。O(L),L 為字符串長度。O(1)。輸入:0-13-162959 處理:數字 0,1,3,1,6,2,9,5,9 加權和 = 0*10 + 1*9 + 3*8 + 1*7 + 6*6 + 2*5 + 9*4 + 5*3 + 9*2 = 185 185 % 11 = 9 → 校驗碼 = 11-9 = 2 輸出:0-13-162959-2