2011年4月27日 星期三

a020: 身分證檢驗

內容 :
我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。

(1) 英文代號以下表轉換成數字
A=10 台北市 J=18 新竹縣 S=26 高雄縣
B=11 台中市 K=19 苗栗縣 T=27 屏東縣
C=12 基隆市 L=20 台中縣 U=28 花蓮縣
D=13 台南市 M=21 南投縣 V=29 台東縣
E=14 高雄市 N=22 彰化縣 W=32 金門縣
F=15 台北縣 O=35 新竹市 X=30 澎湖縣
G=16 宜蘭縣 P=23 雲林縣 Y=31 陽明山
H=17 桃園縣 Q=24 嘉義縣 Z=33 連江縣
I=34 嘉義市 R=25 台南縣

(2) 英文轉成的數字, 個位數乘9再加上十位數的數字
(3) 各數字從右到左依次乘1、2、3、4....8
(4) 求出(2),(3) 及最後一碼的和
(5) (4)除10 若整除,則為 real,否則為 fake

例: T112663836
2 + 7*9 + 1*8 + 1*7 + 2*6 + 6*5 + 6*4 + 3*3 + 8*2 + 3*1 + 6 = 180
除以 10 整除,因此為 real

輸入說明 :
一組身分證號碼

輸出說明 :
輸出 real or fake

範例輸入 :
T112663836
S154287863

範例輸出 :
real
fake

程式碼 :
#include <stdio.h>

int main()
{
    int i,sum,arr[26]={1,10,19,28,37,46,55,64,39,73,82,2,11,20,48,29,38,47,56,65,74,83,21,3,12,30};
    char s[20];

    while(scanf("%s",s)==1)
    {
        sum = arr[s[0]-'A'];
        for(i=1;i<9;i++)
            sum = sum + (s[i]-'0')*(9-i);
        if((sum + (s[9]-'0')) % 10 == 0)
            printf("real\n");
        else
            printf("fake\n");
    }
    return 0;
}


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

沒有留言:

張貼留言