English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

題目:
  是否能在五個數字間插入一些運算子使得結果為23?
  (((a1 O1 a2) O2 a3) O3 a4) O4 a5 '←考慮此算式會不會等於23
a1~a5為5個整數(順序可以隨便排列,但一定都要出現一次),O1~O4為運算子{+,-,*}的其中一個。舉例說明:
輸入5個整數 2,3,5,7,11 可以找到有一組運算式 (((11 * 3) - 5 ) + 2 ) - 7 = 23,所以輸出Possible。(當然,可以得到23的答案的運算式可能不只一組)若輸入的5個整數為 1,1,1,1,1 那就找不到任一種運算式的組合可以使答案為23,所以輸出Impossible。

輸入檔:輸入的第1列有一個正整數 N ,代表以下有幾組測試資料,每一測試資料一列,有5個整數。每個整數均介於 0 到 50 之間。
輸出檔:根據輸入的 5 個整數,判斷是否可能找到使其答案為 23 的運算式。

data.txt(輸入檔)
3
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11

result.txt(輸出檔)
Impossible
Possible
Possible

2006-11-08 04:31:24 · 7 個解答 · 發問者 以晴 2 in 電腦與網際網路 程式設計

我有想過像排列組合那樣,先排出一組算式並計算,如果計算結果等於23就跳出迴圈,並輸出Possible,否則就繼續找下一組算式。
一直這樣不斷重複,直到有結果等於23或所有的組合都計算過為止。
可是這要很久......而且,最大的問題是我不太會排列組合(我只會用好幾層For...Next 下去排而已)

各位大大可以建議我其他的方法嗎?
(程式碼可以不用給,我自己試著寫寫看!)

2006-11-08 13:05:05 · update #1

......在我慢慢打字,慢慢補充的時候就已經有厲害的大大回我了!
W.J.S大謝謝你~
不曉得有沒有其他(更好的)方式呢?

2006-11-08 13:08:04 · update #2

7 個解答

Private Sub Command1_Click()Dim A() As StringDim ANS As IntegerANS = 23 '這邊的ANS可以改成你要的答案A() = Split(Text2.Text, " ") '這邊的Text2.text就是你的數字 只能輸入5個Call R_Loop("01234", 5, 1, A(), ANS)End Sub'====================符號全排列產生====================Private Function DECToTree(ByVal Num As Variant) As StringDim B As IntegerDo    B = Num Mod 3    DECToTree = B & DECToTree    Num = Num \ 3Loop Until Num = 0End Function'======================================================'====================數字全排列產生====================Private Sub R_Loop(First As String, BasicNum As Integer, ByVal Num As Integer, A() As String, ANS As Integer)If BasicNum = Num Then    Dim R As String    For i = 1 To Num        Call Cal(First, A(), ANS) '依產生的數字排列傳入Cal函數作與符號的複合計算        First = Change1(First, Num)    Next iElse    For i = 1 To Num        Call R_Loop(First, BasicNum, Num + 1, A(), ANS)        First = Change1(First, Num)    Next iEnd IfEnd SubPrivate Function Change1(ByRef First As String, ByRef Num As Integer) As String    Change1 = Mid$(First, Num, 1) + Left$(First, Num - 1) + Right$(First, Len(First) - Num)End Function'======================================================'==============複合計算==============Private Sub Cal(ByVal Buf As String, A() As String, ANS As Integer)Dim A1 As IntegerDim CalString As StringFor i = 0 To 80    R = Format(DECToTree(i), "0000")    A1 = A(Val(Mid$(Buf, 1, 1)))    CalString = "(((" & CStr(A1)    For j = 2 To 5        Select Case Mid$(R, j - 1, 1)        Case "0"            A1 = CStr(A1 + Val(A(Val(Mid$(Buf, j, 1)))))            CalString = CalString & "+"        Case "1"            A1 = CStr(A1 - Val(A(Val(Mid$(Buf, j, 1)))))            CalString = CalString & "-"        Case "2"            A1 = CStr(A1 * Val(A(Val(Mid$(Buf, j, 1)))))            CalString = CalString & "*"        End Select        If j <> 5 Then            CalString = CalString & A(Val(Mid$(Buf, j, 1))) & ")"        Else            CalString = CalString & A(Val(Mid$(Buf, j, 1)))        End If    Next j    If A1 = ANS Then Print CalStringNext iEnd Sub'====================================

2006-11-09 18:17:27 補充:
以晴 你太快結束這一題了......
不然到明天絕對會冒出更多比我好的解法(難得有一題覺得不錯的...) Orz

2006-11-09 10:44:06 · answer #1 · answered by ? 5 · 0 0

XD
結束了~沒機會發表我的解答了~
月島大不愧是月島大呀~~

2006-11-09 23:09:16 補充:
http://specterglobe.myweb.hinet.net/four.txt
我的程式碼,其實今天下午月島大告訴我有這個有趣題目時
我就覺得應該用遞迴寫,那時正和月島大談論另一題遞迴的題目....
既然寫了!不貼白不貼囉...

2006-11-10 01:58:42 補充:
過獎啦~~W.J.S大
您和Liu-Liu、愁痕等大大都是知識裡我佩服的人...
我這段程式的執行效能始終不及月島大呀...

2006-11-09 13:32:46 · answer #2 · answered by 幽靈 5 · 0 0

((3 * 5) - 4) * 2 + 1 =23

2006-11-09 16:15:41 補充:
以晴: 你是工科還是商科的選手呢
難得看到這麼厲害的女生(?)

2006-11-10 13:04:01 補充:
http://w3.loxa.com.tw/afu/VB/OP.txt

2006-11-08 18:26:59 · answer #3 · answered by ? 6 · 0 0

以晴
1 2 3 4 5 怎樣配成 23 呢?

2006-11-08 19:23:46 補充:
Dim N&, 輸入$, 輸出$, 指標&, 數值&, 狀態$, 記數&, 算子&(6), 算元&(6)
Private Sub Command1_Click()
 Dim 數
 Open "data.txt" For Input As #1: Input #1, 輸入: N = Val(輸入)
 Open "result.txt" For Output As #2
 For N = 1 To N
  Input #1, 輸入: 輸入 = 輸入 + " "
  For 數 = 1 To 5
   算元(數) = Val(Left(輸入, InStr(1, 輸入, " "))): 輸入 = Mid(輸入, InStr(1, 輸入, " ") + 1)
  Next
  Call 運算
  Print #2, 狀態
 Next
 Close
End Sub
Sub 讀檔()
 Close
End Sub
Sub 運算()
 算子(1) = 1: 指標 = 1: 狀態 = "往下一個": 數值 = 0
 Do
  Select Case 狀態
   Case "往下一個"
    指標 = 指標 + 1: 算子(指標) = 0: 狀態 = "這個變化"
    If 指標 > 5 Then If 計算 = 23 Then 狀態 = "Possible": Exit Do Else 狀態 = "往上一個"
   Case "這個變化"
    算子(指標) = 算子(指標) + 1: If 算子(指標) > 3 Then 狀態 = "往上一個" Else 狀態 = "往下一個"
   Case "往上一個"
    指標 = 指標 - 1: If 指標 <= 1 Then 狀態 = "Impossible": Exit Do Else 狀態 = "這個變化"
  End Select
 Loop
End Sub
Sub 存檔()
End Sub
Function 計算()
 數值 = 0
 For 記數 = 1 To 5
  Select Case 算子(記數)
   Case 1: 數值 = 數值 + 算元(記數)
   Case 2: 數值 = 數值 - 算元(記數)
   Case 3: 數值 = 數值 * 算元(記數)
  End Select
 Next
 計算 = 數值
End Function

2006-11-08 22:14:51 補充:
抱歉,沒看道
順序可以隨便排列
程式要再改

2006-11-09 12:30:09 補充:
以晴
這是老師給我們出的題目,他出了一大堆作業,就剩下這題了...(~"~)
顯然你程度不若弱
你最主要的需求是不用多層巢狀迴路,而能解決問題
答案是可以的
但我的時間無法掌握,且我是初學者 5 級,無法重貼解答
W.J.S. 是我記意中,登記有案的超級高手.
W.J.S. 我在呼換你
請幫幫忙,我也在努力之中,還有其他vb高手,我们一起加油

2006-11-10 13:21:02 補充:
感謝 月島,W.J.S 大大的撘救
有一些同感:
以 以晴 的程度,檔案的存取應該不用寫了

問題結束太快了,我已想出"完全組合"的方法,不用多層迴路,
且每次只要交換兩個資料,就產生一個新的組合,
而且是數值處理
在多元素的情況,有利於數度的提升,
但已經,來不及,所以停止設計

2006-11-10 13:21:59 補充:
不過沒關西,也謝謝 以晴 的題目,讓我學一次乖,月大果然寶刀未老,一出手就奪標,也恭喜月大打破我100%的採用率

想不倒 以晴 真的是女生,女生能寫程式真的很難得
月大,W.J.S 大,還有眾多高手們,多多栽培她
我們都生病了,什麼病呢?
“心臟病”,“糖尿病”.......不
是生了“不寫程式會難過病”
以晴!,對VB有興趣嗎?我們把並傳染給妳好了
及時通,Tuan_Yao@Yahoo.Com.Tw

2006-11-08 14:23:46 · answer #4 · answered by ? 2 · 0 0

'組合的部分大約如下,輸出入檔的部分你自己寫Private Sub Command1_Click()    Dim A%, B%, C%, D%, E%, S, F%(4), G As Boolean        S = Split("2 3 5 7 11")        For A = 0 To 4        F(0) = S(A)        For B = 0 To 4            If A <> B Then               F(1) = S(B)               For C = 0 To 4                   If C <> B And C <> A Then                      F(2) = S(C)                      For D = 0 To 4                          If D <> C And D <> B And D <> A Then                             F(3) = S(D)                             For E = 0 To 4                                 If E <> D And E <> C And E <> B And E <> A Then                                    F(4) = S(E)                                    If Cal(F) Then G = True                                  End If                             Next                          End If                      Next                   End If               Next            End If        Next    Next    If G Then       MsgBox "Possible"    Else       MsgBox "Impossible"    End IfEnd SubFunction Cal(K%()) As Boolean    Dim A%(3), I%, J%, T#, S$, B As Boolean        Do      B = True: Y = Y + 1      T = K(0): S = "(((" & K(0)      For I = 0 To 3          Select Case A(I)                 Case 0                      T = T * K(I + 1)                      S = S & "×" & K(I + 1) '可省略                 Case 1                      T = T + K(I + 1)                      S = S & "+" & K(I + 1) '可省略                 Case 2                      T = T - K(I + 1)                      S = S & "-" & K(I + 1) '可省略          End Select          S = S & ")"          If A(I) < 2 Then B = False      Next      If T = 23 Then         Cal = True         'Exit Function '若只要判斷有無符合,到這就可跳出         Print Left$(S, Len(S) - 1); "=23" '可省略      End If      If B Then Exit Function      A(J) = A(J) + 1      Do Until A(J) < 3         A(J) = 0         J = J + 1         A(J) = A(J) + 1         B = True      Loop      If B Then J = 0    LoopEnd Function

2006-11-08 19:21:01 補充:
用遞迴吧!!

2006-11-09 14:26:57 補充:
To以晴&何大:我現在正跟月島龍生兄討論此題,月大是這方面的高手,馬上會給答案的;API-Guide沒有中文版低

2006-11-09 18:47:33 補充:
來自亡靈的信函 兄:
月大跟我說您也在寫這題,只可惜結束了,沒辦法看到您的大作XD

2006-11-10 00:39:06 補充:
寫的真好(舔舌中),來兄,我不客氣的把它收下且佔有它了XD!

2006-11-08 12:55:01 · answer #5 · answered by W.J.S. 7 · 0 0

嗯...我不清楚這題目是哪裡來的
這是老師給我們出的題目,他出了一大堆作業,就剩下這題了...(~"~)

2006-11-09 13:32:53 補充:
何大謝謝你~
.......我的程度......還有非常大的進步空間!!

looping大
我去查過ACM了~
發現了一件事,我們老師真的很詐!!
題目都跟ACM的題目一樣!他還說他想很久的!!(怒ˋˊ)

W.J.S.大
遞迴...我會好好學的!
(現在碰到的東西好像幾乎都要用到遞迴耶~)

2006-11-09 13:38:29 補充:
剛忘了問W.J.S.大
你之前給的API-Guide有沒有中文版的?
(我翻字典翻到快發瘋了!!)

2006-11-09 14:43:16 補充:
那我繼續翻字典好了...

2006-11-10 07:58:21 補充:
阿......我真的結束太快了...
阿~~~ 突然很後悔......
(我想看更多更好的解法...)

TO:亡靈大大
我看過您的程式也執行來玩過了~~
真的...很棒~~
我又學到東西了!!

2006-11-08 12:18:42 · answer #6 · answered by 以晴 2 · 0 0

真眼熟...ACM的題目.
Q10344: 23 Out of 5

2006-11-08 21:11:26 補充:
因為 1 2 3 4 5 也可以不按順序

2006-11-10 06:28:47 補充:
商科...
算蠻厲害...
至少比我懂VB.苦手!
(下台練功去~~~)

2006-11-08 05:24:10 · answer #7 · answered by ? 4 · 0 0

fedest.com, questions and answers