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

2 則留言:

  1. 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

    回覆刪除
  2. 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

    回覆刪除