噢噢,有個很可愛的女生叫做小樺,她正在排骨牌,每片骨牌上都恰有一個數字。她想要選出其中的幾張骨牌,在不更動順序的情況下,找到這些骨牌所能組合的最大數。
輸入說明 :
每次輸入有多組測資,每組測資佔一行。
在每組測資中,會先有一串數字,依序代表每片骨牌上的數字,最後有一個正整數n(在int範圍以內),代表她要選出其中的幾張骨牌組合成她想要的數。
在每組測資中,會先有一串數字,依序代表每片骨牌上的數字,最後有一個正整數n(在int範圍以內),代表她要選出其中的幾張骨牌組合成她想要的數。
輸出說明 :
請輸出小樺所組合出的那個最大的數。
範例輸入 :
987645821 6
123456789 8
95655645 1
範例輸出 :
987821
23456789
9
提示 :
987645821
123456789
95655645
網誌管理員已經移除這則留言。
回覆刪除1 輸入數字串x,與要選出幾張骨牌數n,設定a=9
回覆刪除2 從字串x中,找出這個a所在字串中的位置,從字串右邊數來第b個,如果找不到a,則a=a-1,重複這個步驟2。
3 如果b=n,則ans=ans & right(x,b)就是答案,輸出後,結束程式。
4 如果b<n,則a=a-1,執行步驟2
5 如果b>n,則x=right(x,b-1)
ans=ans & a,將這個a接到解答ans上,
n=n-1,將要選出的骨牌數減1
6 如果 n=0 ,則ans就是答案,輸出後,結束程式。
否則, a=9,將a重新設定最大值,
執行步驟2
按照老師演算法寫的
回覆刪除Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
Input #1, S, L
Print #2, R(S, L)
Loop
Close
Close
End
End Sub
Function R(x, n)
Dim a, b, ans
Pt1:
a = 9
Pt2:
b = Len(x) - InStr(x, a) + 1
If b = Len(x) + 1 Then a = a - 1: GoTo Pt2:
If b = n Then ans = ans & Right(x, b): R = ans: Exit Function
If b < n Then a = a - 1: GoTo Pt2:
If b > n Then x = Right(x, b - 1): ans = ans & a: n = n - 1
If n = 0 Then R = ans: Exit Function Else GoTo Pt1:
End Function
arro好,
回覆刪除忠實反應出演算法,我很喜歡。
下一次,找一題,你(們)也試試先寫看看演算法。
Dim ans
回覆刪除Private Sub Form_Load()
Me.Hide
Open App.Path & "\out.txt" For Output As #2
Open App.Path & "\in.txt" For Input As #1
Do Until EOF(1)
Input #1, m, n
Call CaSt(m, n, 9)
ans = ""
Loop
Close #1
Close #2
End
End Sub
Sub CaSt(a1, b1, c1)
cs:
X1 = InStr(a1, c1)
If X1 <> 0 Then
X1 = Len(a1) - X1 + 1
Else
c1 = c1 - 1: GoTo cs
End If
If X1 = b1 Then ans = ans & Right(a1, X1): GoTo ne
If X1 < b1 Then c1 = c1 - 1: GoTo cs
If X1 > b1 Then
ans = ans & c1
a1 = Right(a1, X1 - 1)
b1 = b1 - 1
If b1 > 0 Then c1 = 9: GoTo cs Else GoTo ne
End If
ne:
Print #2, ans
End Sub
-----------------------------
in.txt
987645821 6
123456789 8
95655645 1
354165 3
857489844 7
-------------------------------
out.txt
987821
23456789
9
565
8789844
緣尉好,
回覆刪除程式正確。
Dim X As String
回覆刪除Dim N As Byte
Dim B As Byte
Dim ans As String
Private Sub Form_Load()
Me.Hide
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
Input #1, SN, N
X = CStr(SN)
A = 9
ans = ""
Do
B = Find_b(A)
Select Case B
Case Is = N: ans = ans & Right(X, B)
Case Is < N: A = A - 1
Case Is > N: X = Right(X, B - 1): ans = ans & CStr(A): N = N - 1: A = 9
End Select
Loop Until N = 0 Or N = B
Print #2, ans
Loop
Close #2
Close #1
End
End Sub
Function Find_b(A)
If InStr(X, A) <> 0 Then Find_b = (Len(X) - InStr(X, A) + 1)
End Function
-----------------------------
in.txt
987645821 6
123456789 8
95655645 1
354165 3
857489844 7
-------------------------------
out.txt
987821
23456789
9
565
8789844
佑好,
回覆刪除程式正確,很好。