2012年9月14日 星期五
100正式Problem 3:檢查碼問題
子題 1:
中華民國身分證的號碼是經由一串公式所產生出來的,目前中華民國身分證字號一共有十碼,包括第一個大寫的英文字母與接續的九個阿拉伯數字。
(1)第一個碼代表地區,轉換方式為:A 轉換成1,0 兩個字元,B 轉換成1,1,餘如下:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
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 33
(2)第二個碼代表性別,1 代表男性,2 代表女性
(3)第三個碼到第九個字元為流水號碼。
(4)第十個碼為檢查號碼。
例如:A123456789,A 的轉換字元是1 和0,其餘各碼亦轉換成字元。轉換後的字元數值依序存在的變數中,如下:
然後再把每一個變數,依序乘上 1 9 8 7 6 5 4 3 2 1 1 的加權,再相加,如下:
將身分證號碼 A123456789 套入公式,其結果為:
然後再除以 10,如果整除,該組身分證字號為有效。
在客服電話系統中,需要使用者輸入個人身分證號碼,因為電話按鈕只有數字鍵,為了方便使用者輸入身分證,只輸入身分證後面9 個數字,再由客服電話系統告知那些英文字母和這輸入身分證後面9 個數字合起來是有效的身分證號碼,由使用者最後確認身分證號。請寫出客服電話系統需要的程式,使用者輸入身分證後面9 個數字,找出對應有效的英文字母。
例如輸入身分證後面9 個數字”123456789”,和這數字合起有效的身分證號碼為”A123456789”、 ”M123456789”和 ”W123456789”,則客服電話系統中依英文字母順序輸
出AMW。
1 0 1 2 3 4 5 6 7 8 9
n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11
輸入說明:
第 1 行的數字n 代表有幾筆資料要測試,n 的值介於1 和5(含)之間,之後每行為身分證後面9 個數字,不含第一個大寫的英文字母。程式不用檢查輸入格式。
輸出說明:
從第 1 行起每行輸出對應的英文字母,其和輸入身分證後面9 個數字可合為有效的身分證號
碼。列出這些對應到有效的身分證號碼的所有字母,結果依英文字母順序大寫輸出。(輸出均
為大寫,選手請注意。)
輸入檔案 1:【檔名:in1.txt】
3
123456789
123456788
223344556
輸入檔案 2:【檔名:in2.txt】
3
102345678
108881111
101111111
輸出範例:【檔名:out.txt】
AMW
KLY
DOQ
ER
GT
BNZ
訂閱:
張貼留言 (Atom)
Dim a, b
回覆刪除Private Sub Form_Load()
Me.Hide
Open App.Path & "\in1.txt" For Input As #1
Open App.Path & "\in2.txt" For Input As #2
Open App.Path & "\out.txt" For Output As #3
a = Split("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 33", " ")
b = Split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")
Input #1, n
Input #2, n1
For i = 1 To n
Input #1, x
For j = 0 To UBound(b)
ans = a(j) & x
ans1 = 0
Call abc(ans, j)
Next
Print #3,
Next
Print #3,
For i = 1 To n1
Input #2, x
For j = 0 To UBound(b)
ans = a(j) & x
ans1 = 0
Call abc(ans, j)
Next
Print #3,
Next
Close
Close
Close
End
End Sub
Sub abc(ans, j)
For k = 1 To Len(ans)
Select Case k
Case 1
ans1 = ans1 + Val(Mid(ans, k, 1)) * 1
Case 2
ans1 = ans1 + Val(Mid(ans, k, 1)) * 9
Case 3
ans1 = ans1 + Val(Mid(ans, k, 1)) * 8
Case 4
ans1 = ans1 + Val(Mid(ans, k, 1)) * 7
Case 5
ans1 = ans1 + Val(Mid(ans, k, 1)) * 6
Case 6
ans1 = ans1 + Val(Mid(ans, k, 1)) * 5
Case 7
ans1 = ans1 + Val(Mid(ans, k, 1)) * 4
Case 8
ans1 = ans1 + Val(Mid(ans, k, 1)) * 3
Case 9
ans1 = ans1 + Val(Mid(ans, k, 1)) * 2
Case 10
ans1 = ans1 + Val(Mid(ans, k, 1)) * 1
Case 11
ans1 = ans1 + Val(Mid(ans, k, 1)) * 1
End Select
Next
If ans1 Mod 10 = 0 Then Print #3, b(j);
End Sub
Private Sub Form_Load()
回覆刪除Me.Hide
Open App.Path & "\in1.txt" For Input As #1
Open App.Path & "\in2.txt" For Input As #2
Open App.Path & "\out.txt" For Output As #3
Dim t As Boolean
For i = 1 To 2
Input #i, n
a = Split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")
b = Split("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 33", " ")
c = Split("0 1 9 8 7 6 5 4 3 2 1 1", " ")
For j = 1 To n
Line Input #i, s
sss = ""
For k = 0 To UBound(a)
ans = 0
ss = s
ss = b(k) & s
For ii = 1 To Len(ss)
ans = ans + Val(Mid(ss, ii, 1)) * Val(c(ii))
Next ii
If ans Mod 10 = 0 Then sss = sss & a(k)
Next k
Print #3, sss
Next j
Print #3,
Next i
Close #3
Close #2
Close #1
End
End Sub