a054 - 電話客服中心
題目描述
題目要求根據身分證號碼的後 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";
}
}