第1題:身份證檢查-1
N組輸入,每一組一行,為身份證的前9碼,最後少一碼為檢查碼,請輸出n行,各1數字為「檢查碼」
範例:T11266383
身份證第1碼:英文代號以下表轉換成數字
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 澎湖縣
T轉成27 則和 sum = 2*1 + 7*9 接著8個數字各乘8~1 { 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1}
所以 sum = 2*1 + 7*9 + 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1 = 174 ,檢查碼即 sum除10的餘數 6
第2題:身份證檢查-2
身份證的驗證規則與第1題同,但所輸入的資料少了第1碼英文字,請問有哪幾個英文字可能是對的
範例:112663836,sum = a*1+b*9 + 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1+6
,sum會被10整除
(a+9b+115) 若代入27:a=2,b=7 則sum=180是對的,則T可以
又若代入G(16):1+6*9+115 = 170亦可 ,也就是 a分別以1、2、3代入試即可得出
參考解答:
' 第1題 身份證檢查-1 ,少最後1碼(檢查碼),請算出檢查碼
Dim 英to數() = {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,32}
Dim line() = Split(TextBox1.Text, vbNewLine)
Dim n As Integer = Val(line(0))
For i = 1 To n
Label1.Text &= vbCrLf
Dim pid As String = line(i)
Dim num = 英to數(Asc(pid) - 65) '第1個字,查 英to數()陣列 A->10 , B->11 ... Z->32
Dim sum = (num \ 10) + (num Mod 10) * 9
For j = 2 To 9
sum += (Asc(Mid(pid, j, 1)) - 48) * (10 - j)
Next j
Label1.Text &= (10 - sum Mod 10)
Next i
---------第1題 資料---
5
T11266383 Ans: 6
M12345678 Ans: 9
Y12345678 Ans: 8
A22334455 Ans: 3
R10234567 Ans: 8
' 第2題 身份證檢查-2 ,少了第1碼(英文字),請算出可能的英文字母
Dim 數to英 As String = "ABCDEFGHJKLMNPQRSTUVXYWZIO"
Dim line() = Split(TextBox1.Text, vbNewLine)
Dim n As Integer = Val(line(0))
For i = 1 To n
Label1.Text &= vbCrLf
Dim pid As String = line(i)
For a = 1 To 3
Dim sum = a
For j = 1 To 8
sum += (Asc(Mid(pid, j, 1)) - 48) * (9 - j)
Next j
sum += Asc(Mid(pid, 9, 1)) - 48
Dim ans = a * 10 + sum Mod 10 - 9
If ans <= 35 Then Label1.Text &= Mid(數to英, ans, 1)
Next a
Next i
---------第2題 資料---
5
112663836 Ans: GT
108881111 Ans: GT
123456788 Ans: KLY
223344556 Ans: DQO
102345678 Ans: ER
0 意見:
張貼留言