# a020 - 身分證檢驗 ### 題目連結: [a020](https://zerojudge.tw/ShowProblem?problemid=a020) ### 題目解析 * 輸入一個身分證字號,經過身分證字串的規則驗證,求得輸入身分證字號的真假 * 此題的規則一共有 5 個部分,經過簡化濃縮後為以下三種需要處理的計算 * 英文代號轉換數字 * 數字部分依序乘上不同的基數 * 將所有部分加總並除以 10 ### 題目類型 字串/數學/流程控制 ### 範例測資解讀 * 輸入 * 為一個身分證字號,最左邊為英文字母,接著會連續9個數字 * 輸出 * `real / fake`,用來驗證輸入字串的正確性 ### 其他注意事項 * 英文代號轉換數字表需要==刻苦工==,沒辦法用迴圈或條件式的方法快速產生,必須一個一個對照都要打出來 ### 程式解析 * 此題計算規則的部分較無難度,只要依照題目所提供的規則設計程式即可 * 英文代號對照表有兩種方式設計 * 使用 `list` 儲存:需要建立兩個 `list`,一個為英文字、一個為數字 * 使用 `dictionary` 儲存 ### 完整程式碼 (僅供參考) ``` Python=01 import sys def translate_code(ch): 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} return CODE[ch] #start for s in sys.stdin: testID = list(s) # 英文代號轉成數字 area_code = translate_code(testID[0]) # 將個位數和十位數轉換成 x1, x2 數值 x1 = area_code//10 x2 = (area_code%10)*9 # 中間數字的乘積計算 xN = 0 for i in range(1, 8+1): xN += (ord(testID[i])-48) * (9-i) x9 = ord(testID[9])-48 # 求檢查碼, 加總對 10 取餘數 verify_code = (x1+x2+xN+x9)%10 if verify_code == 0: print("real") else: print("fake") ``` ###### tags: `基礎15題解` `APCS` `ZeroJudge`