2012年8月25日 星期六

天平秤重

有一天平,共有四個法碼,分別為1、3、9、27公克。請設計一程式,由"in.txt"輸入某一物品質量(1~40公克)。


輸入範例:
8公克


輸出範例:
左盤1公克,右盤9公克

6 則留言:

  1. Dim ans, ans1 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, x
    For i = -1 To 1
    For j = -1 To 1
    For k = -1 To 1
    For l = -1 To 1
    If i * 1 + j * 3 + k * 9 + l * 27 = x Then Call abc(i, j, k, l)
    Next
    Next
    Next
    Next
    Close
    Close
    End
    End Sub
    Sub abc(a, b, c, d)
    If a < 0 Then ans1 = ans1 + 1
    If a > 0 Then ans = ans + 1
    If b < 0 Then ans1 = ans1 + 3
    If b > 0 Then ans = ans + 3
    If c < 0 Then ans1 = ans1 + 9
    If c > 0 Then ans = ans + 9
    If d < 0 Then ans1 = ans1 + 27
    If d > 0 Then ans = ans + 27
    Print #2, "左盤" & ans1 & "公克,右盤" & ans & "公克"
    End Sub

    回覆刪除
  2. 小冰好,
    程式正確。(也是暴力的方式)
    (還有「更」暴力的)
    (因為題目說好,只有1到40,如果你程式想不出怎麼寫,用excel之類的,人腦算出結果,放在兩個陣列中,不用計算,直接輸出,也會是正確的哦,哈,有沒有「更」暴力啊)

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 哲好,
    程式寫得出來,應該是有看到結果會正確,所以,我就先當它正確。
    但是,太危險。
    你的程式中,一開始就來了個L <> R的話,可是,當時R還沒有值呢。
    然後,一堆的if 已經很容易錯了不說,你還交雜著 單行和多行的if
    再來,你還用了一堆的EXIT FOR,這樣的指令和 goto是同樣的,有另外一個名詞叫「結構化程式的殺手」,用了它,就不怎麼算「結構化」程式設計了。
    什麼意思呢? 就是說,一旦出了小錯誤,「超級」難找到的。
    還有,你也說了,「還好只有4個」,這樣的「不結構化」一旦長了,更是可怕。
    ***
    來吧,不要怕被念,既然寫得出來了,那麼,再來一次吧,用別的方式,寫寫。
    加油。

    回覆刪除
  5. 之前測試的資料不夠多,後來發現有錯先刪
    我想想其他方法:)

    回覆刪除
  6. 一個一個去寫,發現要加的數是小於差額的兩倍的第一個數
    例如輸入5
    L = 5 : R = 0
    差額兩倍:10,小於10的第一個數是9
    L = 5 : R = 9
    差額的兩倍:8,小於8的第一個數是3
    L = 8 : R = 9
    差額的兩倍:2,小於2的第一個數是1
    L = 9 : R = 9 之後在減掉輸入值
    就變成左盤放4 : 右盤放9
    想到之後就比較好寫了,但是還是用到一個離開迴圈的動作..

    Option Base 1
    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, L
    R = 0
    LL = L
    a = Array(1, 3, 9, 27)
    Do Until L = R
    x = Abs(L - R) * 2
    For i = 4 To 1 Step -1
    If x > a(i) Then x = a(i): Exit For
    Next i
    If L > R Then R = R + x Else L = L + x
    Loop
    Print #2, "左盤" & L - LL & "公克,右盤" & R & "公克"
    Close #2
    Close #1
    End
    End Sub

    回覆刪除