2011年1月10日 星期一

授權碼檢查

Nanosoft資訊軟體公司研發出一套商用軟體,準備於市面上販售,但唯恐遭到未經授權之不合法使用,因此在安裝軟體時,需要使用者輸入授權馬。試寫一個程式,其功能可以檢核此授權碼的正確信。
【規則敘述】
此授權碼由十個位數合成,每一位數可以為0~9的任何一個數字,是判斷方法如下:
首先,將此碼逐次的累加,使的第二位數成為第一位數到第二位數的和,第三位數為第一位數到第三位數的和....第十位數為第一位數到第十位數的和;
進行完第一次的累加和後 ,接著再將所得到的十個數字,第十個數字減掉第一個數字,第九個數字減掉第二個數字....以此類推,得到五組數字,將此五組數字由小到大排列後成為一個新的數列。
此新數列的後三碼為識別碼,必須可為11整除,方為正確的授權碼,故在螢幕上列印出"此為合法之授權碼",反之則印出"此為不合法之授權碼",若授權碼格式錯誤則顯示"授權碼格式錯誤"。

輸入範例:
請輸入授權碼:9476282354
輸出範例:
此為合法之授權碼

【提示】
輸入授權碼為9476282354
第一次運算後得到數列 9 13 20 26 28 36 38 41 46 50
第二次運算後得到數列 41 33 21 12 8
排序後得到數列引 812213341 (341被11整除)


參照: http://chscvb.blogspot.com/2010/02/20100201.html

7 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Dim ans(10)
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, a

    If Len(a) <> 10 Then Print #2, "授權碼格式錯誤": End

    For i = 1 To 10
    ans(i) = Int(Mid(a, i, 1)) + Int(ans(i - 1))
    Next

    For i = 1 To 5
    ans(i) = ans(11 - i) - ans(i)
    Next

    For i = 1 To 5
    For j = 1 To 4
    If ans(j) > ans(j + 1) Then
    tmp = ans(j)
    ans(j) = ans(j + 1)
    ans(j + 1) = tmp
    End If
    Next
    Next

    For i = 1 To 5
    lastch = lastch & ans(i)
    Next

    lastch = Right(lastch, 3)

    If lastch Mod 11 = 0 Then Print #2, "此為合法之授權碼" Else Print #2, "此為不合法之授權碼"

    Close #2
    Close #1
    End
    End Sub



    --------------
    因為隨身碟目前失蹤,所以做完先PO囉

    回覆刪除
  2. arro好,
    1.If Len(a) <> 10 Then Print #2, "授權碼格式錯誤": End 這行結束的太快,兩個打開的檔,都沒有結束,容易出錯。
    2.格式錯誤,是不是和身分証一樣,還有一個條件呢? 要仔細些。
    3.你的第一個迴圈很好,第二個迴圈也很好。但是,再來是排序,是必須的嗎?想一想。雖然沒有錯。
    熊掌

    回覆刪除
  3. Private Sub Form_Load()
    Me.Hide
    Dim k(50)
    Dim l(5)
    Dim a As String

    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1

    Input #1, x

    For i = 1 To Len(x)
    m = Mid(x, i, 1)
    n = n + Val(m)
    k(i) = n
    Next

    l(0) = Val(k(10) - k(1))
    l(1) = k(9) - k(2)
    l(2) = k(8) - k(3)
    l(3) = k(7) - k(4)
    l(4) = k(6) - k(5)

    For i = 0 To 3
    For j = 0 To 3

    If l(j) > l(j + 1) Then Call chg(l(j), l(j + 1))

    Next j
    Next i

    For i = 0 To 4
    a = a & l(i)
    Next

    b = Right(a, 3)
    If Val(b) Mod 11 = 0 Then

    Print #2, "此為合法之授權碼"

    Else
    Print #2, "此為不合法之授權碼"

    End If

    Close #1
    Close #2
    End
    End Sub
    Sub chg(a, b)
    t = a
    a = b
    b = t
    End Sub

    回覆刪除
  4. 緣尉好,
    你的程式正確。
    兩個小地方,一是和arro一樣的問題,這個排序是必要的嗎?
    另一個是,變數的使用,不要用容易看錯的英文字,像o,i,l
    再來的寒假,是第一個努力的關卡,加油哦。
    (就是說,一不小心,會在寒假的耐力賽中,失去動力而出現危機哦,加油)

    熊掌

    回覆刪除
  5. Dim N As String
    Dim A(10) As Integer
    Dim B(10) As Integer
    Dim C(5) As Integer
    Dim D As String

    Private Sub Form_Load()

    Open App.Path & "\in.txt" For Input As #1
    Input #1, N
    Close #1

    For i = 1 To 10
    A(i) = Mid(N, i, 1)
    B(i) = B(i - 1) + A(i)
    Next i

    For i = 1 To 5
    C(i) = B(11 - i) - B(i)
    Next i

    For i = 1 To 4
    For j = (i + 1) To 5
    If C(i) > C(j) Then
    CC = C(i)
    C(i) = C(j)
    C(j) = CC
    End If
    Next j
    Next i

    For i = 1 To 5
    D = D & C(i)
    Next i


    Open App.Path & "\out.txt" For Output As #2

    If Val(Right(D, 3)) Mod 11 = 0 Then
    Print #2, "此為合法之授權碼"
    Else
    Print #2, "此為不合法之授權碼"
    End If
    Close #2

    End
    End Sub

    回覆刪除
  6. 佑好,程式正確,排序多餘。

    回覆刪除
  7. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, n
    Call A1(n)
    Close
    Close
    End
    End Sub

    Sub A1(a)
    Dim S(10) As Integer
    For i = 1 To Len(a)
    m = Mid(a, i, 1)
    S(i) = S(i - 1) + m
    Next

    S(10) = S(10) - S(1)
    S(9) = S(9) - S(2)
    S(8) = S(8) - S(3)
    S(7) = S(7) - S(4)
    S(6) = S(6) - S(5)
    ans = S(6) & S(7) & S(8) & S(9) & S(10)
    ans = Right(ans, 3)
    If ans Mod 11 = 0 Then Print #2, "此為合法之授權碼" Else Print #2, "此為不合法之授權碼"
    End Sub



    5:15
    題目看得久了點,為求快+安全 所以直接用 S(10)=s(10)-s(1)的爛方法

    回覆刪除