題目連結 https://zerojudge.tw/ShowProblem?problemid=a054
建議類題 a020. 身分證檢驗
解題思路 本題的題意相當複雜,簡單來說就是要我們透過檢查碼反推可能的英文字母。 而檢查碼的算法如下:
將身分證字號中代表出生縣市的英文代號依照附圖的方式轉換成數字。
將1.的數字的個位數字乘以9倍並加上十位數字。
將身分證字號的數字部分,由左到右分別乘上8、7、6、5、4、3、2、1、1。
令s為2.加上3.的和,m為s的個位數,檢查碼c即為10-m。
因此,我們可以將身份證號碼的後9碼用字元陣列儲存,經由運算得到各位相對數字乘積的總和s後,推得檢查碼c,進而依據c值輸出對應的出生縣市。
注意事項 switch()條件句 是條件句之一。使用時,將想要判斷的數值或字元放在switch後面的括弧裡,並在case列出可能的情況,程式就會自動依據case指定的數字、字元或判斷句的情形,執行相對應的程式區塊。
程式碼:C語言 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #include <stdio.h> int main () { char num[10 ]; scanf ("%s" , num); int s = 0 ; for (int i = 0 ; i < 8 ; i++) s += (num[i]-48 )*(8 -i); s += num[8 ]-48 ; int c = 10 -s%10 ; if (c == 10 ) c = 0 ; switch (c) { case 0 : printf ("BNZ" ); break ; case 1 : printf ("AMW" ); break ; case 2 : printf ("KLY" ); break ; case 3 : printf ("JVX" ); break ; case 4 : printf ("HU" ); break ; case 5 : printf ("GT" ); break ; case 6 : printf ("FS" ); break ; case 7 : printf ("ER" ); break ; case 8 : printf ("DOQ" ); break ; case 9 : printf ("CIP" ); break ; } return 0 ; }