# Greedy# String Manipulation# Arithmetic

a054 - 電話客服中心

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據身分證號碼的後 9 碼,推算可能的第一個英文字母。推算規則是將後 9 碼轉換為數字,依據特定權重計算加權和,再計算檢查碼,最後找出對應檢查碼的字母。如果有多個字母符合條件,則依字母順序輸出。

解題思路

程式碼首先定義了一個陣列 a,用於將字母轉換為對應的數字。然後讀取輸入的 9 位數字字串,將其轉換為整數陣列 d。接著,根據題目描述的公式計算加權和 num,並計算檢查碼 num。最後,遍歷 a 陣列,找出對應檢查碼的字母,並按照字母順序輸出。

複雜度分析

  • 時間複雜度: O(1)。程式碼的執行時間與輸入長度無關,因為輸入長度固定為 9。迴圈遍歷的次數固定為 26,因此時間複雜度為常數。
  • 空間複雜度: O(1)。程式碼使用的額外空間是固定的,包括 a 陣列和 d 陣列,它們的大小都是固定的,因此空間複雜度為常數。

程式碼

#include <iostream>
#include <string>

using namespace std;

int main()
{
	std::ios::sync_with_stdio(false);
    std::cin.tie(0);
	int a[26]={1,0,9,8,7,6,5,4,9,3,2,2,1,0,8,9,8,7,6,5,4,3,1,3,2,0};
	string c;
	while (cin >> c) {
		int d[9], num;
		for (int i=0;i<9;i++) {
			d[i]=c[i]-48;
		}
		num=d[0]*8+d[1]*7+d[2]*6+d[3]*5+d[4]*4+d[5]*3+d[6]*2+d[7]+d[8];
		num=(10-num%10)%10;
		for (int i=0;i<26;i++) {
			if (a[i]==num) cout << char (i+65);
		}
		cout << "\n";
	}
}

Discussion