大家知道為什麼不能反攻大陸嗎? (從身分證編碼規則談起 ..)
有很多傳說.. 美國杜魯門總統阻撓?
其實最主要原因是因為 身份證號碼 不夠用了 .. 嘿嘿嘿!
身份字號的第一位為英文字母,阿它代表你的出生地(其實應該說是登記出生的所在), 參見下表。
第二位為數字,是男女生之代碼,男生為 1,女生為 2, (? 阿變性的應該可以用 3 和 4 代表男變女 或 女變男..?) 接下來為流水號 (sequence number), 最後一位則為檢查號碼, 是算出來的! 這樣怎會跟反攻大陸有關呢? 是這樣的, 當初開始統編身份證號碼時, 省屬以上單位只有 22 個, 就是以下沒有星號(*)帶頭的, 所以 IO 很像 1 與 0 不用, W 與 M 對沒學過英文的會搞錯不用, Z 很像 2 也不用 後來金門縣用掉 W 對應 32, 連江縣用掉 Z 對應 33, 最後嘉義市和新竹市分別升格為省轄市把 I 和 O 也用掉了! (以前住嘉義市的和嘉義縣的一樣用Q, 新竹市的在民國70年以前的和新竹縣一樣用 J) (注意下表如果把有星號的項目拿掉則號碼是連續的) 至此二十六個字母用光了, 不允許再升格(聽說這也導致後來的廢省:-) 阿當然也不能反攻大陸了! 不然身份證號碼就沒辦法編了. . (以上純屬瞎掰, 若有巧合 .. 阿就是巧合咩:) 算檢查碼(最後一位)要先把英文碼根據下表轉換成兩位數字 :
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 台南縣 計算查號碼的演算法:
(a) 先把英文字母依照上表轉成兩位數字,
這樣連同其餘數字共有十一位 最右邊一位是檢查碼, 是依據其餘十位算出來的
(b) 各數字從左到右依次乘上 1, 9, 8, 7, 6, 5, 4, 3, 2, 1 (檢查碼先不管)
(c) 求出(b)之和,除以10取餘數,再用10減該餘數,結果就是檢查碼,
但是若餘數為0,則檢查碼就是 0。 例如: 身份證號碼 A123456789 剛好是個合法的號碼: A 1 2 3 4 5 6 7 8 9 1 0 1 9 8 7 6 5 4 3 2 1 ------------------------------------ 1 + 0 + 8+14+18+20+20+18+14+ 8 = 121 121 % 10 = 1 ( % 就是取餘數) 10 - 1 = 9 即為 檢查碼 (check sum) **問題思考 : 1. 為什麼要採取 weighted sum 來算 check sum?
2. 這樣檢查碼的比重剛好也是 1, 有蛇麼缺點?
3. 新竹市最後把 O 用掉對應 35 是個嚴重的錯誤
因為 O 有時寫不好會被誤為 D, 此時 O 和 D 互相寫錯是查不出來的, 為蛇麼?
4. 寫程式如何 A 對到10, B對到11, ... ? 有很多方法! 可用超級賴皮法寫26個 if :-)
可以利用一段一段(A到H, J到N, ...)寫數個 if,
當然更方便的是乾脆造一個 table (array) 來查! 如何查?-- "Beware of bugs in the above code; I have only proved it correct, not tried it." -- Donald Knuth (/usr/games/fortune) Murphy's Law is recursive. Washing your car to make it rain doesn't work. It is much easier to suggest solutions when you know nothing about the problem.