* z; _& g$ V5 h0 A事實上,如果一個身份證號碼的正確核對值為 A,而在輸入資料時,(由右邊數起的)第 k 個位原本是 a,但現在錯入成 b(a ¹ b),那麼該核對值將會變成! f% r! z0 b- w- U
3 j4 N4 F3 h1 V9 q& c; ]
A - a ´ k + b ´ k = A + (b - a) ´ k + p+ r$ o) F4 d/ {+ ] , x1 J2 H' J Z$ D) w5 I留意在這裏,除非錯誤發生在第一個位的英文字母上,否則 (b - a) 的絕對值和k都祇會是 1 至 10 之間的數字,不會大於 11,故此 (b - a) ´ k 這個部分,不可能被 11 整除。但因為 A 本身可以被 11 整除,所以整個核對值 A + (b - a) ´ k,便不能被 11 所整除了。由此可以知道輸入的資料有錯。 5 F0 P1 k+ h# `- o/ t. P; e4 j- _9 ` 2 o6 r$ O0 ^" j) P當然,應用核對值的方法有一個死穴,就是頭一個字母如果錯入了一個和原本字母相隔 11 個位的字母,例如:將 “H856249(2)” 錯入成 “S856249(2)”(其核對值為 308,可以被 11 整除),那麼電腦亦無法知道到輸入的資料有錯了。不過,相信發生如此錯誤的機會極之小,所以這個方法亦相當可靠。 1 d8 B' X: C) ^( K( J& t) f) ~$ r0 y
還有,如果輸入資料時出現 2 處或以上的錯誤,例如:將 “H856249(2)” 錯入成 “H856049(A)”,我們亦無法將錯誤檢查出來。(當然,如果太容易出現 2 處的輸入錯誤,那麼我認為最佳的解決辦法,就是辭退那位輸入員,改聘另一位更可靠的人選了!) , v( b7 K B% r# a2 w- G. I+ Z ; a8 y u. ?' f8 P! h2 V; v另一個秘密 0 n& v! _5 Y4 j$ |# u) Y c留意在上面的討論中,那個位值倍數其實沒有多大的作用。事實上,如果我們不乘上任何倍數而直接將所有數位加起來,再定出一個核對數位,我們依然可以檢查出輸入資料時(1 處)的錯誤。那麼,我們為甚麼需要加入這個位值倍數呢? ) N5 F r4 ?+ d# Y1 _, _ 6 g9 C% C7 T1 m2 N原來這亦是用來防止一般人一個容易犯上的錯誤,這就是誤將其中的兩個數字的位置對調。例如:將 “H856249(2)” 錯誤地變成 “H856294(2)”。 1 j$ F- I5 x8 M* Z# k9 N# T 8 @. i7 x/ c8 U! f我們再假設正確身份證號碼的核對值為 A,第 k 位的數字為 a,第 k + n 位的數字為 b(a ¹ b;n ³ 1),如果我們錯誤地將 a、b 兩個數字對調了,那麼該核對值便會變成 1 @( r& I2 l; k( u5 ^% @$ L# v1 p* X% @/ U; I: V! M! H
A - a ´ k - b ´ (k + n) + a ´ (k + n) + b ´ k = A + (a - b) ´ n ' X4 N% I7 ^. Q
) k/ b% T- H; O! A. k+ l同理,a、b 和 n 都祇會是 0 至 9 之間的數字,故此 (a - b) ´ n 這個部分,以至是整個核對值,都不能被 11 所整除,由此可以知道輸入的資料有錯了。留意如果沒有這個位值倍數,我們就無法偵測出這種錯誤了。" B4 L$ d0 b; J% y ^& s