###### tags: Basic - [x] check # a054: 電話客服中心 :::info 很多銀行及公司設立了電話客服中心來服務他們的客戶。為了加速身分的查核,常常會要求打電話進來的客戶輸入他的身分證號碼。可是電話上只有數字鍵,要輸入身分證號碼的第一個字母有點麻煩,因此有的語音系統會要求來電者輸入後 9 碼,再根據後 9 碼來推算可能的英文字母。 很多人都知道,身分證號碼的最後一碼是「檢查碼」,它是用前 9 碼所推算出來的,其推算的規則如下: 先依照下表將英文字母轉換為 2 位數字,再加上第 2 到第 9 位的 8 位數字一共有 10 位數字。 台北市 A 10 彰化縣 N 22 台中市 B 11 新竹市 O 35 基隆市 C 12 雲林縣 P 23 台南市 D 13 嘉義縣 Q 24 高雄市 E 14 台南縣 R 25 台北縣 F 15 高雄縣 S 26 宜蘭縣 G 16 屏東縣 T 27 桃園縣 H 17 花蓮縣 U 28 嘉義市 I 34 台東縣 V 29 新竹縣 J 18 金門縣 W 32 苗栗縣 K 19 澎湖縣 X 30 台中縣 L 20 陽明山 Y 31 南投縣 M 21 連江縣 Z 33 由左至右,第一位乘 1,第二位乘 9,第三位乘 8,第四位乘 7...,以此類推,最後一位乘 1。 求各位相對數字乘積的總和 s。 求 s 的個位數 m。(檢查碼只有一位數,因此若 c = 10 時,則檢查碼為 0。) 檢查碼 c = 10 - m 。 假設某人的身份證號碼前 9 碼為 F13024567,那麼他的最後一位檢查碼的計算過程如下: F 1 3 0 2 4 5 6 7 1 5 1 3 0 2 4 5 6 7 ×1 ×9 ×8 ×7 ×6 ×5 ×4 ×3 ×2 ×1 1 + 45 + 8 + 21 + 0 + 10 + 16 + 15 + 12 + 7 = 135 檢查碼 = 10 - (135 % 10) = 5 根據上面的規則,A12345678、M12345678 和 W12345678 這三個號碼的檢查碼都是 9。因此,如果在電話上所輸入的後 9 碼是 123456789 時,它的第一位英文字母可能是 A,也可能是 M 或 W。 | input | output | | -------- | -------- | | 130245675 | FS | | 123456789 | AMW | ::: ### 1st Ideas of solving a problem(slowly) >1. Use a array(data type:char) to build a alphabet table. > ```=c #include<stdio.h> #include<string.h> void cal(int,int); int main(){ int input; scanf("%d",&input); cal(input/10,input%10);//使用自定義函數 } void cal(int a,int b){ int temp=0,i; char alphabet[27]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};//利用兩個陣列建立表格,相呼應位置 int num[26]={10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33}; for(i=1;i<=8;i++){ temp+=(a%10)*i; a=a/10; } for(i=0;i<=26;i++){ int check;//使用到區域變數和全域變數的概念temp每次回圈結束後仍不歸零,而check歸零 check=0; check=((num[i]%10)*9+(num[i]/10)*1)+temp; if(((check%10)!=0)&&((10-(check%10))==b)){ printf("%c",alphabet[i]); } else if(((temp%10)==0)&&(((10-(temp%10))%10)==b)){ printf("%c",alphabet[i]); } } printf("\n"); } ``` :::danger 測資148不過 :::