程式碼解說--身份證字號規則說明
確認一組身分證號碼是否合法?? 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
類似題:ACM Q333: Recognizing Good ISBNs 或 ISBN