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
一個一個去寫,發現要加的數是小於差額的兩倍的第一個數 例如輸入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
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
小冰好,
回覆刪除程式正確。(也是暴力的方式)
(還有「更」暴力的)
(因為題目說好,只有1到40,如果你程式想不出怎麼寫,用excel之類的,人腦算出結果,放在兩個陣列中,不用計算,直接輸出,也會是正確的哦,哈,有沒有「更」暴力啊)
作者已經移除這則留言。
回覆刪除哲好,
回覆刪除程式寫得出來,應該是有看到結果會正確,所以,我就先當它正確。
但是,太危險。
你的程式中,一開始就來了個L <> R的話,可是,當時R還沒有值呢。
然後,一堆的if 已經很容易錯了不說,你還交雜著 單行和多行的if
再來,你還用了一堆的EXIT FOR,這樣的指令和 goto是同樣的,有另外一個名詞叫「結構化程式的殺手」,用了它,就不怎麼算「結構化」程式設計了。
什麼意思呢? 就是說,一旦出了小錯誤,「超級」難找到的。
還有,你也說了,「還好只有4個」,這樣的「不結構化」一旦長了,更是可怕。
***
來吧,不要怕被念,既然寫得出來了,那麼,再來一次吧,用別的方式,寫寫。
加油。
之前測試的資料不夠多,後來發現有錯先刪
回覆刪除我想想其他方法:)
一個一個去寫,發現要加的數是小於差額的兩倍的第一個數
回覆刪除例如輸入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