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
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囉
arro好,
回覆刪除1.If Len(a) <> 10 Then Print #2, "授權碼格式錯誤": End 這行結束的太快,兩個打開的檔,都沒有結束,容易出錯。
2.格式錯誤,是不是和身分証一樣,還有一個條件呢? 要仔細些。
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
緣尉好,
回覆刪除你的程式正確。
兩個小地方,一是和arro一樣的問題,這個排序是必要的嗎?
另一個是,變數的使用,不要用容易看錯的英文字,像o,i,l
再來的寒假,是第一個努力的關卡,加油哦。
(就是說,一不小心,會在寒假的耐力賽中,失去動力而出現危機哦,加油)
熊掌
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
佑好,程式正確,排序多餘。
回覆刪除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)的爛方法