題目在 https://zerojudge.tw/ShowProblem?problemid=a054
做過 a020. 身分證檢驗後, 現在要用後面九碼猜出可能的區域碼.
我的方法是把A到Z全部加到後九碼, 形成26個身分證字號, 每個都檢驗一遍, 就知道哪個是可能的.
程式修改一下a020的就可以了.
#include <iostream>
#include <string>
#include <map>
using namespace std;
bool isValis(string id) {
// 建立轉換表
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}
};
// 檢查輸入的字串長度
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) {
return true;
} else {
return false;
}
}
int main() {
string id_number;
cin >> id_number;
for(int i=0;i<26;i++){ //從A到Z全部算一遍
string full_id=char('A'+i)+id_number;
if(isValis(full_id)){
printf("%c",'A'+i);
}
}
return 0;
}
C++