zerojudge a054. 電話客服中心

題目在 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++