#54870: 這題不簡單,大家加油!!!


yp11452024@yphs.tp.edu.tw (704-03吳恩頤)


這題我沒有用很難的程式碼寫

意思可以等於我用列舉的

可以參考

(我覺得比較好懂)

#include <iostream>
using namespace std;

int main() {
    int first;
    // 身分證字號共 10 字元,額外 +1 空間給結束字元 '\0',防止記憶體溢位
    char id[11];

    // 讀取使用者輸入的身分證字號
    cin >> id;

    // --- 第一部分:身分證首位字母轉換邏輯 ---
    // 根據中華民國身分證編碼規則,將字母轉換為對應的兩位整數數值
    // 注意:I, O, W, Z 等字母並非按英文字母順序排列
    if(id[0]=='A') first=10;
    if(id[0]=='B') first=11;
    if(id[0]=='C') first=12;
    if(id[0]=='D') first=13;
    if(id[0]=='E') first=14;
    if(id[0]=='F') first=15;
    if(id[0]=='G') first=16;
    if(id[0]=='H') first=17;
    if(id[0]=='I') first=34;
    if(id[0]=='J') first=18;
    if(id[0]=='K') first=19;
    if(id[0]=='L') first=20;
    if(id[0]=='M') first=21;
    if(id[0]=='N') first=22;
    if(id[0]=='O') first=35;
    if(id[0]=='P') first=23;
    if(id[0]=='Q') first=24;
    if(id[0]=='R') first=25;
    if(id[0]=='S') first=26;
    if(id[0]=='T') first=27;
    if(id[0]=='U') first=28;
    if(id[0]=='V') first=29;
    if(id[0]=='W') first=32;
    if(id[0]=='X') first=30;
    if(id[0]=='Y') first=31;
    if(id[0]=='Z') first=33;

    // --- 第二部分:加權總和運算與檢查碼驗證 ---
    // 運算規則:
    // 1. 字母轉換後之十位數 * 1 + 個位數 * 9
    // 2. 其後數字依序乘上權重 8, 7, 6, 5, 4, 3, 2, 1
    // 3. 最後一位檢查碼乘上權重 1
    // 4. 所有數值相加後,若能被 10 整除即為合法字號
    
    // (id[i] - '0') 是將字元型態轉換為對應的整數值
    if(((first%10)*9 + (first/10) + 
        (id[1] - '0') * 8 + 
        (id[2] - '0') * 7 + 
        (id[3] - '0') * 6 + 
        (id[4] - '0') * 5 + 
        (id[5] - '0') * 4 + 
        (id[6] - '0') * 3 + 
        (id[7] - '0') * 2 + 
        (id[8] - '0') * 1 + 
        (id[9] - '0') * 1) % 10 == 0) {
        
        cout << "real" << endl; // 驗證成功
    } else {
        cout << "fake" << endl; // 驗證失敗
    }

    return 0;
}