題目:
是否能在五個數字間插入一些運算子使得結果為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
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⤋