Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a054. 電話客服中心

題目連結

https://zerojudge.tw/ShowProblem?problemid=a054

建議類題

a020. 身分證檢驗

解題思路

本題的題意相當複雜,簡單來說就是要我們透過檢查碼反推可能的英文字母。
而檢查碼的算法如下:

  1. 將身分證字號中代表出生縣市的英文代號依照附圖的方式轉換成數字。
  2. 將1.的數字的個位數字乘以9倍並加上十位數字。
  3. 將身分證字號的數字部分,由左到右分別乘上8、7、6、5、4、3、2、1、1。
  4. 令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() {
//宣告並讀取字元陣列num,代表身份證號碼的後9碼
char num[10];
scanf("%s", num);
//宣告變數s,代表身分證字號各位相對數字乘積的總和
int s = 0;
//將身分證字號的數字部分由左到右分別乘上8、7、6、5、4、3、2、1,最後再加上末碼
for(int i = 0 ; i < 8 ; i++)
s += (num[i]-48)*(8-i);
s += num[8]-48;

//宣告變數c,代表檢查碼
//將10減去s的個位數後,即可得c
int c = 10-s%10;
//檢查碼只有一位數,因此若c=10時,則檢查碼為0
if(c == 10)
c = 0;
//依據c值反推可能的出生縣市
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;
}