程式碼解說--身份證字號規則說明

確認一組身分證號碼是否合法?? 
1.目前的中華民國身分證字號一共有十碼,包括起首一個大寫的英文字母與接續的九個阿拉伯數字。
   (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),而首位數字則是拿來區分性別,男性為1、女性為2,
2.規則說明:
   (1)英文轉成的數字, 個位數乘9再加上十位數 
   (2)各數字從右到左依次乘1、2、3、4....8 
   (3)求出(1),(2)之和 
   (4)求出(3)除10後之餘數,用10減該餘數,結果就是檢查碼,若餘數為0 
     檢查碼就是0 
ex.

程式碼如下:

#include<stdio.h>
#include<stdlib.h>
int id_num(char ch)
{
    switch(ch)
    {
        case 'A': return 10 ;break;   case 'P': return 23; break;
        case 'B': return 11 ;break;   case 'Q': return 24; break;
        case 'C': return 12 ;break;   case 'R': return 25; break;
        case 'D': return 13 ;break;   case 'S': return 26; break;
        case 'E': return 14 ;break;   case 'T': return 27; break;
        case 'F': return 15 ;break;   case 'U': return 28; break;
        case 'G': return 16 ;break;   case 'V': return 29; break;
        case 'H': return 17 ;break;   case 'W': return 32; break;
        case 'I': return 34 ;break;   case 'X': return 30; break;
        case 'J': return 18 ;break;   case 'Y': return 31; break;
        case 'K': return 19 ;break;   case 'Z': return 33; break;
        case 'L': return 20 ;break;   
        case 'M': return 21 ;break;   
        case 'N': return 22 ;break;   
        case 'O': return 35 ;break;
    }
}
main()
{
    int idnum[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}; //建表法
    char id[11];
    id[10]='\0';
    int i=0,tmp,total=0;
    for(i=0;i<10;i++)
        scanf("%c",&id[i]);
    if(id[0]<='z'&& id[0]>='a') id[0]-=32; //小寫轉大寫 

    tmp=id_num(id[0]);  //將英文字轉成數字
    //tmp=idnum[id[0]-'A'];//將英文字轉成數字<----第二種轉法-建表法

//這邊需要檢查id[1]只能為1 或2 
    total=(tmp%10)*9+tmp/10+(id[1]-'0')*8+(id[2]-'0')*7+(id[3]-'0')*6+(id[4]-'0')*5+(id[5]-'0')*4+(id[6]-'0')*3+(id[7]-'0')*2+(id[8]-'0')*1;
    if((10-total%10) ==(id[9]-'0'))
        printf("%s為合格身份證字號\n",id);
    else
        printf("%s不為合格身份證字號\n",id);   //這邊缺少餘數為0的判斷。
    system("PAUSE");
}
You can test those data
Q123456789:Error
M123456789:correct
A234567820:correct
類似題:ACM Q333: Recognizing Good ISBNsISBN