首先我們必須了解台灣身分證的相關格式,舉個例子如A123456789,從這個例子中我們不難發現,身分證一共有10碼,分別是一個代表你的戶籍地址的英文以及9碼數字。然而這9碼數字其中開頭與結尾是有規則性的,讓我們一步步的了解所有的規則吧 !
首先是開頭的英文字母,一共有A~Z共26個英文大寫字母,他們分別代表的意思如下:
A (10) | 台北市 | G (16) | 宜蘭縣 | M (21) | 南投縣 | S (26) | 高雄縣 | Y (31) | 陽明山 |
B (11) | 台中市 | H (17) | 桃園縣 | N (22) | 彰化縣 | T (27) | 屏東縣 | Z (33) | 連江縣 |
C (12) | 基隆市 | I (34) | 嘉義市 | O (35) | 新竹市 | U (28) | 花蓮縣 |
|
|
D (13) | 台南市 | J (18) | 新竹縣 | P (23) | 雲林縣 | V (29) | 台東縣 |
|
|
E (14) | 高雄市 | K (19) | 苗栗縣 | Q (24) | 嘉義縣 | W (32) | 金門縣 |
|
|
F (15) | 台北縣 | L (20) | 台中縣 | R (25) | 台南縣 | X (30) | 澎湖縣 |
|
For example , A (10) 是台北市,(10) 數字代表的是 A 這個英文字轉換成的數字。
以身分證字號整體規劃如下:
Y | x8 | x7 | x6 | x5 | x4 | x3 | x2 | x1 | Z |
A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
英文 | 性別 | 編號1 | 編號2 | 編號3 | 編號4 | 編號5 | 編號6 | 編號7 | 檢查碼 |
我們剛剛已經介紹過英文了,現在來介紹第一碼數字,第一碼數字只有 1 與 2 ,1代表的是男生,2則是女生。至於編號1~7則是戶政事務所給予的配號,當我們在設計程式時編號1~7可以是亂數,不過最後要套入公式計算最後一碼的檢查碼,現在我們來看身分證如何計算:
Y = 個位數字 * 9 + 十位數字/10
Z =
10-(Y + x8 * 8 + x7 * 7 + x6 * 6 + x5 * 5 + x4 * 4 + x3 * 3 + x2 * 2 + x1 * 1)%10
例如:A123456789這個範例 ,
A (10) => 10 / 10 + 0 * 9 = 1
10 - ( 1 + 8 + 14 + 18 +20 + 20 + 18 + 14 + 8) / 10 取餘數(相當於C++中的%) = Z
( 1 + 8 + 14 + 18 +20 + 20 + 18 + 14 + 8) = 121
除以10餘1,因此10-1 = 9 ,這個9即是最後一碼的檢查碼。
在舉個更簡單的範例,例如 T12354660X 檢查碼應該是 ?
T(27) => 20 / 10 + 7*9 = 65
10-(65 + 1*8 + 2*7 + 3*6 + 5*5 + 4*4 + 6*3 + 6*2 + 0*1)%10 => 4
因此完整的身分證字號應該是 T123546604
這邊提供一個檢查的公式
X = Y + x8 * 8 + x7 * 7 + x6 * 6 + x5 * 5 + x4 * 4 + x3 * 3 + x2 * 2 + x1 * 1 + Z
X除以10,必定餘0 。我們在來檢查剛剛的範例吧
(65 + 8 + 14 + 18 + 25 +16 +18 +12 + 0 + 4 )% 10 = 0
網路上也有提供不同的方式,他們是定義成
X1+X2 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 |
A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
十位數字為X1 個位數字為X2 | 性別 | 編號1 | 編號2 | 編號3 | 編號4 | 編號5 | 編號6 | 編號7 | 檢查碼 |
Y = X1 + 9*X2 + 8*D1 + 7*D2 + 6*D3 + 5*D4 + 4*D5 + 3*D6 + 2*D7+ 1*D8 + D9
Y除以10,若餘0,則是沒問題的身分證字號。
以上兩種方式只是對於數字的定義不同,沒什麼差異,只是我習慣用上面的方式。
關於身分證:
* 身分證的歷史 : 在民國五十四年才有配給台灣民眾身分證,當時使用的只有9碼,開頭的英文以及八碼的數字,而且到了14歲才能獲的配號;到了民國五十八年新增了檢查碼,也就是上面提到的第九碼,提供基礎的驗證之用;到了民國六十年,初生的嬰兒就能獲得身分證配號,五十四年則是到14歲才能獲得配號,但是能然必須要年滿14歲才能領取身分證。
*有關於英文字母的方面,有人說從此可以看出戶籍地,但是卻不是必然的,因為民國六年年以前的出生者是依照戶籍地而定,然而六十年以後的民眾是依照申報戶口的戶政事務所所在的縣市,來決定英文代號。
程式設計概念:
非常的基礎簡單,只要會亂數,就能夠寫的出來,實在太簡單了,這邊就... 不敘述了。
所需程式技能:
1. 字串或陣列概念(用來儲存身分證字號)
2. 亂數
引導:
1.可以先提供使用者選擇英文代碼,或者亂數產生
2.選定性別 , 或是亂數產生 (可以 rand()%2 + 1的方式來產生)
3.隨機給予亂數7碼
4.計算檢查號
5.輸出