m' S# o) f# Q+ P( [8 ´ 8 + 8 ´ 7 + 5 ´ 6 + 6 ´ 5 + 2 ´ 4 + 4 ´ 3 + 9 ´ 2 + 2 ´ 1 = 220 6 ?" j$ ?. S$ @; b 7 q, _" T0 N& m# {7 @明顯這個數能夠被11所整除。假如在輸入資料時,將其中 1 個位的數字或字母搞錯,例如:變成 “K856249(2)”、“H856049(2)” 或 “H856249(A)”,那麼計算出來的核對值就會分別變成 244、212 和 228。由於這些數值不能被 11 整除,因此我們便知道這些號碼有錯了。 4 h1 n1 `1 [ S8 { c2 N3 {4 Z: { % M! u6 L. w+ l# S% y% T+ f) T$ J, w事實上,如果一個身份證號碼的正確核對值為 A,而在輸入資料時,(由右邊數起的)第 k 個位原本是 a,但現在錯入成 b(a ¹ b),那麼該核對值將會變成 7 i K% T6 J6 L; r% o* a# [- { * i: |5 l& ^' E! ?A - a ´ k + b ´ k = A + (b - a) ´ k . R! a8 [* t9 X+ [6 W
* r& o& a) P0 A9 o+ {
留意在這裏,除非錯誤發生在第一個位的英文字母上,否則 (b - a) 的絕對值和k都祇會是 1 至 10 之間的數字,不會大於 11,故此 (b - a) ´ k 這個部分,不可能被 11 整除。但因為 A 本身可以被 11 整除,所以整個核對值 A + (b - a) ´ k,便不能被 11 所整除了。由此可以知道輸入的資料有錯。 7 B, C" Z# m k! b ' o# V- y& C/ b$ t當然,應用核對值的方法有一個死穴,就是頭一個字母如果錯入了一個和原本字母相隔 11 個位的字母,例如:將 “H856249(2)” 錯入成 “S856249(2)”(其核對值為 308,可以被 11 整除),那麼電腦亦無法知道到輸入的資料有錯了。不過,相信發生如此錯誤的機會極之小,所以這個方法亦相當可靠。 ( `8 c# ?2 T) w! T. B8 V+ z2 C7 e. u' Z/ W+ H) o
還有,如果輸入資料時出現 2 處或以上的錯誤,例如:將 “H856249(2)” 錯入成 “H856049(A)”,我們亦無法將錯誤檢查出來。(當然,如果太容易出現 2 處的輸入錯誤,那麼我認為最佳的解決辦法,就是辭退那位輸入員,改聘另一位更可靠的人選了!)8 d2 P- O: ?* L0 O# R5 Q
- }2 y7 e& {& u1 W另一個秘密 $ I7 E+ s' ]: [' I& y/ y7 e0 s; a留意在上面的討論中,那個位值倍數其實沒有多大的作用。事實上,如果我們不乘上任何倍數而直接將所有數位加起來,再定出一個核對數位,我們依然可以檢查出輸入資料時(1 處)的錯誤。那麼,我們為甚麼需要加入這個位值倍數呢?7 L' D+ g1 p ~7 j, q" _* b; f
" m; P# U( p; [原來這亦是用來防止一般人一個容易犯上的錯誤,這就是誤將其中的兩個數字的位置對調。例如:將 “H856249(2)” 錯誤地變成 “H856294(2)”。" k, b0 T. e5 D8 [- c, E* V
/ X; W" H, j x8 V! P# g E
我們再假設正確身份證號碼的核對值為 A,第 k 位的數字為 a,第 k + n 位的數字為 b(a ¹ b;n ³ 1),如果我們錯誤地將 a、b 兩個數字對調了,那麼該核對值便會變成9 K5 H( Q7 B6 q- h8 N4 S$ E
0 X# C2 A2 N# V. X; n: n
A - a ´ k - b ´ (k + n) + a ´ (k + n) + b ´ k = A + (a - b) ´ n # p9 c9 t$ B9 r% j; F9 m3 h
/ l( _1 X2 V# J; _7 [
同理,a、b 和 n 都祇會是 0 至 9 之間的數字,故此 (a - b) ´ n 這個部分,以至是整個核對值,都不能被 11 所整除,由此可以知道輸入的資料有錯了。留意如果沒有這個位值倍數,我們就無法偵測出這種錯誤了。6 K/ X/ ] y2 K$ j5 w" p