首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Sicily 1129 ISBN 校驗碼計算:字符串處理與模運算

     編輯:C++ 入門

Sicily 1129 ISBN — 校驗碼計算邏輯與實現

問題:ISBN-10 由 10 個數字組成(含連字符)。前 9 位數字加權求和:第 1 位權重 10,第 2 位 9,... 第 9 位權重 2。校驗碼(第 10 位)使總和能被 11 整除。若需補 10,校驗碼為 X。輸入 ISBN 字符串(不含校驗碼),輸出完整 ISBN(含 - 和校驗碼)。

算法步驟

  1. 遍歷字符串,提取數字字符 '0'~'9',按順序賦權重 10 遞減至 2 累加。
  2. 計算 sum % 11:
      若餘數 0 → 校驗碼 0。
      否則校驗碼 = 11 - 餘數。
      若校驗碼 == 10 → 用 X 表示。
  3. 輸出原字符串 + - + 校驗碼。

代碼實現

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;
}

關鍵點

  • 忽略輸入中的非數字字符(如連字符),只處理數字。
  • 權重從 10 遞減到 2,共 9 位數字參與計算。
  • 模 11 運算:(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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved