24h購物| | PChome| 登入
2011-06-10 21:27:15| 人氣3,322| 回應2 | 上一篇 | 下一篇

a054. 電話客服中心

推薦 0 收藏 0 轉貼0 訂閱站台

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

內容 :

很多銀行及公司設立了電話客服中心來服務他們 的客戶。為了加速身分的查核,常常會要求打電話進來的客戶輸入他的身分證號碼。可是電話上只有數字鍵,要輸入身分證號碼的第一個字母有點麻煩,因此有的語 音系統會要求來電者輸入後 9 碼,再根據後 9 碼來推算可能的英文字母。

很多人都知道,身分證號碼的最後一碼是「檢查碼」,它是用前 9 碼所推算出來的,其推算的規則如下:

  1. 先依照下表將英文字母轉換為 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
  2. 由左至右,第一位乘 1,第二位乘 9,第三位乘 8,第四位乘 7...,以此類推,最後一位乘 1。
  3. 求各位相對數字乘積的總和 s。
  4. 求 s 的個位數 m。
  5. 檢查碼 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。

輸入說明 :

輸入有若干筆測試資料,每筆一行,含有一個身份證號碼的後 9 碼。

輸出說明 :

對於每筆測試資料,將可能的第一位大寫字母依字母順序輸出於一行。

範例輸入 :

130245675
123456789

範例輸出 :

FS
AMW

提示 :

出處 :

板橋高中教學題 (管理:snail)



作法 : 模擬

/**********************************************************************************/
/*  Problem: a054 "電話客服中心" from 板橋高中教學題                 */
/*  Language: C                                                                   */
/*  Result: AC (6ms, 238KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-10 13:56:09                                     */
/**********************************************************************************/


#include<stdio.h>
main() {
    char id[27][3] =     {
    "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"};
    char s[10];
    while(scanf("%s", s) == 1) {
        int sum = 0, a;
        for(a = 0; a < 8; a++)
            sum += (s[a]-48) * (8-a);
        s[8] = (s[8] == '0') ? 10 + '0': s[8];
        for(a = 0; a < 26; a++)
            if(10 - (sum + id[a][0] - '0' + (id[a][1] - '0')*9)%10 == (s[8] - '0'))
                printf("%c", a+'A');
        puts("");
    }
    return 0;
}

台長: Morris
人氣(3,322) | 回應(2)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:d769. 共有多少種走法?
此分類上一篇:a144. 整數分拆

Lee
原本還以為要用甚麼方法倒推回去!!
沒想到只要省下第一個計算過程,然後利用同餘代入26個數字就能過了
2011-06-27 21:56:09
Lee
c = 0太邪惡了
2011-06-27 22:54:20
版主回應
邪惡啊,請大家一起分享遇到的邪惡 bug
2011-06-29 08:22:46
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文