這題我沒有用很難的程式碼寫
意思可以等於我用列舉的
可以參考
(我覺得比較好懂)
#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;
}