zerojudge a020. 身分證檢驗

題目在 https://zerojudge.tw/ShowProblem?problemid=a020

這題考的是根據身分證編碼規格, 判斷身分證是否正確. 所以只要看懂編碼規格, 應該就可以寫出來.

我叫Chat AI來寫, 他一直寫錯. 其實不是他寫不出來, 是他看不懂題目. 這考題變成在考中文能力.

為了讓AI寫出正確的程式, 我把題目改寫後, AI終於寫對了. 他還加上了註解. 所以看程式就知道在寫什麼.

下面是我改寫的題目和他寫的程式.

我國的身分證字號有底下這樣的規則,請您用C++寫個程式來判斷一個身分證字號是否是正常的號碼

(1) 第一碼為英文代號以下表轉換成數字

      A=10 台北市     J=18 新竹縣     S=26 高雄縣
      B=11 台中市     K=19 苗栗縣     T=27 屏東縣
      C=12 基隆市     L=20 台中縣     U=28 花蓮縣
      D=13 台南市     M=21 南投縣     V=29 台東縣
      E=14 高雄市     N=22 彰化縣     W=32 金門縣
      F=15 台北縣     O=35 新竹市     X=30 澎湖縣
      G=16 宜蘭縣     P=23 雲林縣     Y=31 陽明山
      H=17 桃園縣     Q=24 嘉義縣     Z=33 連江縣
      I=34 嘉義市     R=25 台南縣

  英文轉成的數字, 個位數乘9再加上十位數的數字

 (2) 第二到九碼, 各數字依次乘8 7 6 5 4 3 2 1

 (3) 求出(1),(2) 及第十碼的和

 (4) (3)除10 若整除,則輸出 real,否則輸出 fake

 例: T112663836

2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180

除以 10 整除,因此為 real 

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main() {
    // 建立轉換表
    map<char, int> id_map{
        {'A', 10}, {'B', 11}, {'C', 12}, {'D', 13}, {'E', 14}, {'F', 15}, {'G', 16}, {'H', 17},
        {'I', 34}, {'J', 18}, {'K', 19}, {'L', 20}, {'M', 21}, {'N', 22}, {'O', 35}, {'P', 23},
        {'Q', 24}, {'R', 25}, {'S', 26}, {'T', 27}, {'U', 28}, {'V', 29}, {'W', 32}, {'X', 30},
        {'Y', 31}, {'Z', 33}
    };

    string id;
    cout << "請輸入身分證字號: ";
    cin >> id;

    // 檢查輸入的字串長度
    if (id.length() != 10) {
        cout << "fake" << endl;
        return 0;
    }

    // 計算第一個數字的值
    int first_num = id_map[id[0]];
    int first_sum = (first_num / 10) + (first_num % 10 * 9);

    // 計算第二到九個數字的值
    int second_sum = 0;
    for (int i = 1; i < 9; i++) {
        int num = id[i] - '0';
        second_sum += num * (9 - i);
    }

    // 計算第十個數字的值
    int last_num = id[9] - '0';

    // 計算總和
    int sum = first_sum + second_sum + last_num;

    // 判斷是否為正確的身分證字號
    if (sum % 10 == 0) {
        cout << "real" << endl;
    } else {
        cout << "fake" << endl;
    }

    return 0;
}
C++