2011年6月1日 星期三

自動販賣機

自動販賣機的物品價格為10-25元,銅板種類1,5,10,50四種,讀取"in.txt"物品價格,計算可能的投幣方式與需找回的零錢。
輸入範例:

11
輸出範例: 

1*11=11 找0元
1*6+5*1=11 找0元
1*1+5*2=11 找0元
5*3=15 找4元
1*1+10*1=11 找0元
5*1+10*1=15 找4元
10*2=20 找9元
50*1=50 找39元
出自 程式設計隊訓練教材

5 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1
    cop = Split("1 5 10 50")
    Do Until EOF(1)
    Input #1, p
    For i = 0 To UBound(cop)
    tot = p \ Val(cop(i))
    If p Mod Val(cop(i)) = 0 Then
    Print #2, cop(i) & " * " & tot & " = " & Val(cop(i)) * tot & " 元 ; 找 0 元"
    Else
    tot = tot + 1
    Print #2, cop(i) & " * " & tot & " = " & Val(cop(i)) * tot & " 元 ; 找 " & Val(cop(i)) * tot - p & " 元"
    End If
    Next
    a = p
    '5
    s = 1
    Do Until s * cop(1) >= a
    Print #2, cop(1) & " * " & s & " + " & cop(0) & " * " & a - Val(cop(1)) * s & " 元 ; 找 0 元"
    s = s + 1
    Loop
    '10
    s = 1
    Do Until s * cop(2) >= a
    Print #2, cop(2) & " * " & s & " + " & cop(0) & " * " & a - Val(cop(2)) * s & " 元 ; 找 0 元"
    s = s + 1
    Loop
    '10 & 5
    s = 1
    Do Until a < 10
    If p = (Val(cop(2)) * s) Then Exit Do
    If (Val(cop(2)) * s - a) < 0 Then mm = a - (Val(cop(2)) * s) Else mm = (Val(cop(2)) * s - a)
    If mm \ 5 = 0 Then mm = mm \ 5 + 1 Else mm = mm \ 5
    If Val(cop(2)) * s + Val(cop(1)) * mm - a < 0 Then mm = mm + 1
    Print #2, cop(2) & " * " & s & " + " & cop(1) & " * " & mm & " 元 ; 找 " & Val(cop(2)) * s + Val(cop(1)) * mm - a & " 元"
    dl:
    s = s + 1
    a = a - 10
    Loop
    a = p
    Print #2, "-----------------------"
    Loop
    Close #1
    Close #2
    End
    End Sub
    -----------------------------
    in.txt
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    回覆刪除
  2. 1 * 20 = 20 元 ; 找 0 元
    5 * 4 = 20 元 ; 找 0 元
    10 * 2 = 20 元 ; 找 0 元
    50 * 1 = 50 元 ; 找 30 元
    5 * 1 + 1 * 15 元 ; 找 0 元
    5 * 2 + 1 * 10 元 ; 找 0 元
    5 * 3 + 1 * 5 元 ; 找 0 元
    10 * 1 + 1 * 10 元 ; 找 0 元
    10 * 1 + 5 * 2 元 ; 找 0 元
    -----------------------
    1 * 21 = 21 元 ; 找 0 元
    5 * 5 = 25 元 ; 找 4 元
    10 * 3 = 30 元 ; 找 9 元
    50 * 1 = 50 元 ; 找 29 元
    5 * 1 + 1 * 16 元 ; 找 0 元
    5 * 2 + 1 * 11 元 ; 找 0 元
    5 * 3 + 1 * 6 元 ; 找 0 元
    5 * 4 + 1 * 1 元 ; 找 0 元
    10 * 1 + 1 * 11 元 ; 找 0 元
    10 * 2 + 1 * 1 元 ; 找 0 元
    10 * 1 + 5 * 3 元 ; 找 4 元
    10 * 2 + 5 * 1 元 ; 找 14 元
    -----------------------
    1 * 22 = 22 元 ; 找 0 元
    5 * 5 = 25 元 ; 找 3 元
    10 * 3 = 30 元 ; 找 8 元
    50 * 1 = 50 元 ; 找 28 元
    5 * 1 + 1 * 17 元 ; 找 0 元
    5 * 2 + 1 * 12 元 ; 找 0 元
    5 * 3 + 1 * 7 元 ; 找 0 元
    5 * 4 + 1 * 2 元 ; 找 0 元
    10 * 1 + 1 * 12 元 ; 找 0 元
    10 * 2 + 1 * 2 元 ; 找 0 元
    10 * 1 + 5 * 3 元 ; 找 3 元
    10 * 2 + 5 * 1 元 ; 找 13 元
    -----------------------
    1 * 23 = 23 元 ; 找 0 元
    5 * 5 = 25 元 ; 找 2 元
    10 * 3 = 30 元 ; 找 7 元
    50 * 1 = 50 元 ; 找 27 元
    5 * 1 + 1 * 18 元 ; 找 0 元
    5 * 2 + 1 * 13 元 ; 找 0 元
    5 * 3 + 1 * 8 元 ; 找 0 元
    5 * 4 + 1 * 3 元 ; 找 0 元
    10 * 1 + 1 * 13 元 ; 找 0 元
    10 * 2 + 1 * 3 元 ; 找 0 元
    10 * 1 + 5 * 3 元 ; 找 2 元
    10 * 2 + 5 * 1 元 ; 找 12 元
    -----------------------
    1 * 24 = 24 元 ; 找 0 元
    5 * 5 = 25 元 ; 找 1 元
    10 * 3 = 30 元 ; 找 6 元
    50 * 1 = 50 元 ; 找 26 元
    5 * 1 + 1 * 19 元 ; 找 0 元
    5 * 2 + 1 * 14 元 ; 找 0 元
    5 * 3 + 1 * 9 元 ; 找 0 元
    5 * 4 + 1 * 4 元 ; 找 0 元
    10 * 1 + 1 * 14 元 ; 找 0 元
    10 * 2 + 1 * 4 元 ; 找 0 元
    10 * 1 + 5 * 3 元 ; 找 1 元
    10 * 2 + 5 * 1 元 ; 找 11 元
    -----------------------
    1 * 25 = 25 元 ; 找 0 元
    5 * 5 = 25 元 ; 找 0 元
    10 * 3 = 30 元 ; 找 5 元
    50 * 1 = 50 元 ; 找 25 元
    5 * 1 + 1 * 20 元 ; 找 0 元
    5 * 2 + 1 * 15 元 ; 找 0 元
    5 * 3 + 1 * 10 元 ; 找 0 元
    5 * 4 + 1 * 5 元 ; 找 0 元
    10 * 1 + 1 * 15 元 ; 找 0 元
    10 * 2 + 1 * 5 元 ; 找 0 元
    10 * 1 + 5 * 3 元 ; 找 0 元
    10 * 2 + 5 * 1 元 ; 找 10 元

    回覆刪除
  3. 緣尉好,
    程式分段解決問題,思緒會容易清晰,程式正確,很好。

    回覆刪除
  4. Dim N As Byte
    Dim Money(4) As Byte
    Dim Back As Integer
    Dim total As Integer
    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
    Money(1) = 1
    Money(2) = 5
    Money(3) = 10
    Money(4) = 50

    Call ABC(0, 0, 0, 0, 0)


    Close #2
    Close #1



    End
    End Sub

    Sub ABC(A, ByVal M1, ByVal M5, ByVal M10, ByVal M50)


    If A >= N Then
    total = 1 * M1 + 5 * M5 + 10 * M10 + 50 * M50
    Back = total - N

    Do
    p = False
    If (Back >= 10) And (M10 >= 1) Then M10 = M10 - 1: total = total - 10: Back = total - N: p = True
    Loop Until p = False

    Do
    p = False
    If (Back >= 5) And (M5 >= 1) Then M5 = M5 - 1: total = total - 5: Back = total - N: p = True
    Loop Until p = False

    Do
    p = False
    If (Back >= 1) And (M1 >= 1) Then M1 = M1 - 1: total = total - 1: Back = total - N: p = True
    Loop Until p = False


    If M1 <> 0 Then ans = "1*" & M1: If M5 <> 0 Or M10 <> 0 Or M50 <> 0 Then ans = ans & "+"
    If M5 <> 0 Then ans = ans & "5*" & M5: If M10 <> 0 Or M50 <> 0 Then ans = ans & "+"
    If M10 <> 0 Then ans = ans & "10*" & M10: If M50 <> 0 Then ans = ans & "+"
    If M50 <> 0 Then ans = ans & "50*" & M50

    ans = ans & "=" & total & "找" & Back & "元"

    p = False
    For I = 0 To (List1.ListCount - 1)
    If List1.List(I) = ans Then p = True
    Next I

    If p = False Then
    List1.AddItem ans
    Print #2, ans
    End If

    Else

    Call ABC(A + Money(4), M1, M5, M10, M50 + 1)
    Call ABC(A + Money(3), M1, M5, M10 + 1, M50)
    Call ABC(A + Money(2), M1, M5 + 1, M10, M50)
    Call ABC(A + Money(1), M1 + 1, M5, M10, M50)

    End If
    End Sub

    --------------------
    in.txt
    10
    --------------------
    out.txt
    50*1=50找40元
    10*1=10找0元
    5*2=10找0元
    1*5+5*1=10找0元
    1*10=10找0元
    --------------------

    in.txt
    15
    --------------------
    out.txt
    50*1=50找35元
    10*2=20找5元
    5*1+10*1=15找0元
    1*5+10*1=15找0元
    5*3=15找0元
    1*5+5*2=15找0元
    1*10+5*1=15找0元
    1*15=15找0元
    --------------------

    in.txt
    20
    --------------------
    out.txt

    50*1=50找30元
    10*2=20找0元
    5*2+10*1=20找0元
    1*5+5*1+10*1=20找0元
    1*10+10*1=20找0元
    5*4=20找0元
    1*5+5*3=20找0元
    1*10+5*2=20找0元
    1*15+5*1=20找0元
    1*20=20找0元
    --------------------

    in.txt
    25
    --------------------
    out.txt
    50*1=50找25元
    10*3=30找5元
    5*1+10*2=25找0元
    1*5+10*2=25找0元
    5*3+10*1=25找0元
    1*5+5*2+10*1=25找0元
    1*10+5*1+10*1=25找0元
    1*15+10*1=25找0元
    5*5=25找0元
    1*5+5*4=25找0元
    1*10+5*3=25找0元
    1*15+5*2=25找0元
    1*20+5*1=25找0元
    1*25=25找0元

    --------------------
    我的方法是先找出所有可能,
    然後再由找回的錢去,
    退回去,
    EX:
    1*24+10*1=34找9元
    再由9元去除1元

    回覆刪除
  5. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\out.txt" For Output As #2
    Open App.Path & "\in.txt" For Input As #1
    cop = Split("1 5 10 50")
    Do Until EOF(1)
    Input #1, p
    For i = 0 To UBound(cop)
    tot = p \ Val(cop(i))
    If p Mod Val(cop(i)) = 0 Then
    Print #2, cop(i) & " * " & tot & " = " & Val(cop(i)) * tot & " 元 ; 找 0 元"
    Else
    tot = tot + 1
    Print #2, cop(i) & " * " & tot & " = " & Val(cop(i)) * tot & " 元 ; 找 " & Val(cop(i)) * tot - p & " 元"
    End If
    Next
    a = p
    '5
    s = 1
    Do Until s * cop(1) >= a
    Print #2, cop(1) & " * " & s & " + " & cop(0) & " * " & a - Val(cop(1)) * s & " 元 ; 找 0 元"
    s = s + 1
    Loop
    '10
    s = 1
    Do Until s * cop(2) >= a
    Print #2, cop(2) & " * " & s & " + " & cop(0) & " * " & a - Val(cop(2)) * s & " 元 ; 找 0 元"
    s = s + 1
    Loop
    '10 & 5
    s = 1
    Do Until a < 10
    If p = (Val(cop(2)) * s) Then Exit Do
    If (Val(cop(2)) * s - a) < 0 Then mm = a - (Val(cop(2)) * s) Else mm = (Val(cop(2)) * s - a)
    If mm \ 5 = 0 Then mm = mm \ 5 + 1 Else mm = mm \ 5
    If Val(cop(2)) * s + Val(cop(1)) * mm - a < 0 Then mm = mm + 1
    Print #2, cop(2) & " * " & s & " + " & cop(1) & " * " & mm & " 元 ; 找 " & Val(cop(2)) * s + Val(cop(1)) * mm - p & " 元"
    dl:
    s = s + 1
    a = a - 10
    Loop
    a = p
    Print #2, "-----------------------"
    Loop
    Close #1
    Close #2
    End
    End Sub

    回覆刪除