# a054 - 電話客服中心 ### 題目連結: [a054](https://zerojudge.tw/ShowProblem?problemid=a054) ### 題目解析 * 與 a020 身分證檢驗使用相同的公式計算流程 * 但是變成需要藉由後面9個數字反向推可能的英文字母代碼 ### 題目類型 字串/流程控制 ### 範例測資解讀 * 輸入 * 為身份證字號後9碼,不含英文字母 * 輸出 * 可能的英文字母代號,必須要按照字母順序出現 ### 其他注意事項 無 ### 程式解析 首先將字母轉換碼使用字典的格式建立 ``` python CODE = {'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} ``` 由於此題需要透過公式反查可能的字母代碼,因此我們可以先將 CODE 的兩位數字轉成公式中的數值 * CODE數值 = 十位數+個位數*9 ``` python #用於快速查找字母 code_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' #記錄26個字母的CODE數值 codeSum = [] for i in range(26): x1 = int(CODE[code_string[i]]/10) x2 = CODE[code_string[i]]%10*9 codeSum.append( x1+x2 ) ``` 程式的前置工作已經完成,接下來可以讀取測試資料進行計算 首先後九碼必須要與公式的計算方式相同 ![](https://i.imgur.com/z03UP9B.png) ![](https://i.imgur.com/TflLDaO.png) 接著分成三個部分加總 * codeSum * 中間8碼累加,以 xN 代替 * 最後1碼檢查碼.以 checkSum 代替 若此身分證後九碼為真的身分證,則必須滿足以下條件 * (codeSum+xN+checkSum)%10 == 0 因此我們可以建立一個迴圈,對於codeSum之中的26種數值進行加總比對,如果有滿足條件,則代表是可能的英文代碼 ``` python for x in range(26): if (codeSum[x]+xN+checkSum)%10 == 0: word = code_string[x] print(word, end='') ``` 最後將程式碼調整為解題的輸出入流程即可 ### 完整程式碼 (僅提供參考) ``` python=01 import sys CODE = {'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} code_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' codeSum = [] #set x1+x2 for i in range(26): x1 = int(CODE[code_string[i]]/10) x2 = CODE[code_string[i]]%10*9 codeSum.append( x1+x2 ) #start for s in sys.stdin: testID = list(s) checkSum = int(testID[8]) xN = 0 for i in range(7+1): xN += int(testID[i])*(8-i) for x in range(26): if (codeSum[x]+xN+checkSum)%10 == 0: word = code_string[x] print(word, end='') print() ``` ###### tags: `基礎15題解` `APCS` `ZeroJudge`