2011年5月2日 星期一

一串數字

噢噢,有個很可愛的女生叫做小樺,她正在排骨牌,每片骨牌上都恰有一個數字。她想要選出其中的幾張骨牌,在不更動順序的情況下,找到這些骨牌所能組合的最大數。

輸入說明 :
每次輸入有多組測資,每組測資佔一行。
在每組測資中,會先有一串數字,依序代表每片骨牌上的數字,最後有一個正整數n(在int範圍以內),代表她要選出其中的幾張骨牌組合成她想要的數。

輸出說明 :
請輸出小樺所組合出的那個最大的數。

範例輸入 :
987645821 6 
123456789 8 
95655645  1
範例輸出 :
987821 
23456789 
9
提示 :
987645821
123456789
95655645

8 則留言:

  1. 網誌管理員已經移除這則留言。

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

    回覆刪除
  3. 按照老師演算法寫的


    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

    回覆刪除
  4. arro好,
    忠實反應出演算法,我很喜歡。
    下一次,找一題,你(們)也試試先寫看看演算法。

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

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

    回覆刪除
  7. 佑好,
    程式正確,很好。

    回覆刪除