算24點,是一種常見的智力遊戲。它可以使用抽去大小王的撲克牌來玩,隨便抽出4張牌,要求通過加、減、乘、除等四則運算,並使用所有的這4個數,將結果算為24。在玩這個遊戲時,撲克牌中的jqk記為11,12和13。
用集算器,可以比較方便地編寫程式,根據隨便給定的4個數,計算出遊戲的解答,如下面的24points.dfx:ab
cd1=arg1
[+,-,*,/]
2=to(0,255).([~\64+1, ~%64\16+1,~%16\4+1,~%4+1])
=a2.select(~.id().count()==4)
3=to(0,63).([~\16+1, ~%16\4+1,~%4+1])
=a3.select(~.eq([1,2,3]))
=a3.(~.(b1(~)))
4=b2.(~.(a1(~)))
=a4.id()
5for b4
for b3
for c3
>func(a8,a5,b5,c5)
6=c1.id(~)
for a6
if round(eval(b6),3) ==24
>d1=d1|b6
7if d1.len()==0
>d1=」no answer.」
8func
=a8.(~)
9=b8.(~)
for b9
>b9.(~=~-if(#>#c9 && ~>c9,1,0))
10for b9
=d8(b10)/c8(#b10)/ d8(b10+1)
>d8.delete(b10)
11if #b10==3
>c1=c1&c10
12else
>d8(b10)=」(「/c10/」)」
13return d1
其中,arg1用引數輸入使用的4張牌上的數,引數也可在a1中檢視:
下面,詳細分析一下這段**。
計算使用的4個數在a1中給出,這裡用的四張牌是8,3,8,3。首先,在算24點時,應該嘗試4張牌的所有順序。所以,先在a2中,利用乙個4位的4進製數,來列出4張牌的可重複排列情況。在b2中,僅選出不重複排列的情況如下:
在計算時,4個數中間共需要插入3個四則運算符號,每個符號都可以從加減乘除中4選1。在a3中迴圈乙個3位的4進製數,列出所有情況如下:
在計算時,不同的計算順序會影響結果,可以通過新增括號來調整計算順序。3個運算符號,說明計算可以分為3個位置執行,新增括號即是決定這3個位置的執行順序。在b3中,從a3的結果中選擇了同時包含1,2,3的組合,即為所有可能的執行順序如下:
由於選出的4張牌中,有可能出現重複的數,為了避免因此造成的多餘迴圈,在a4中把所有的牌面排列順序列出,並在b4中去掉了可能出現的重複的排列情況。對於a1中給出的[8,3,8,3],b4中列出排列結果如下:
在第5行的程式中,對於每種數的排列,迴圈每一種符號選擇,並迴圈所有的計算順序,呼叫a8中的子程式計算。
呼叫a8中的子程式時,數值串行、符號串行和計算順序序列,分別填到a8,b8,c8中,並在d8中準備計算使用的表示式。單步計算完成後,原有的總計算步數就少了1步,還需要在第9行中相應調整計算順序序列。在b10中執行迴圈,每計算一步,都將兩個數或表示式用計算符號連線起來,同時在d8中刪除1個佔位。在第11行執行判斷,對於最後一步計算,將把獲得的表示式新增到序列c1中。如果是中間步驟,則會在新生成的表示式中新增括號,以保證計算順序,並將這部分表示式更新到d8中。
這樣,當第5行**中迴圈呼叫子程式完畢,就在c1中得到了所有可能出現的表示式。其中會有一些重複的情況,因此在a6中用id()函式去掉重複的表示式。c1和a6中的表示式序列如下:
在b6中迴圈a6中的各個表示式,判斷結果是否等於24,判斷時只需用eval函式計算表示式的結果即可,考慮到雙精度數的計算誤差,結果保留3位小數。如果結果等於24,說明當前個表示式可以滿足條件,在d6中,將其儲存到d1中。
在所有的情況都迴圈完畢後,在a7中,如果發現d1中未填入任何表示式,則說明無解。
計算完成後,就可以在d1中檢視結果如下:
如果需要修改使用的4張牌,則可在計算前修改網格引數arg1,如修改為[7,3,3,7]:
計算後,d1中檢視到的結果如下:
可以在另一段程式中,通過呼叫24points.dfx,計算出所有4張撲克牌組合的結果:ab
c1=file(「d:/file/24points.dfx」)
=create(num1,num2,num3,num4,answer)213
=a2*a2
=b2*a2
3=to(0,a2*c2-1).([~\c2+1, ~%c2\b2 +1,~%b2\a2+1,~%a2+1])
=a3.(~.sort()).id()
>b3.run((a=~,b1.insert(0,a(1),a(2),a(3),a(4),call(a1,a))))
4=file(「d:/file/24points.txt」)
>a4.export@t(b1)
在這段**中,a3中列出4張撲克牌的所有組合:
在c3中,針對b3中的每一種情況,呼叫24points.dfx來計算結果,並將結果記錄在b1的表中,計算結束後,b1中得到的結果如下:
趣味集算 算二十四
算 24 點,是一種常見的智力遊戲。它可以使用抽去大小王的撲克牌來玩,隨便抽出 4 張牌,要求通過加 減 乘 除等四則運算,並使用所有的這 4 個數,將結果算為 24。在玩這個遊戲時,撲克牌中的 jqk 記為 11,12 和 13。用集算器,可以比較方便地編寫程式,根據隨便給定的 4 個數,計算出遊...
二十四點演算法
給出四個數,不可以重複使用,可以用 和括號,怎麼得出24?return 1 表示當前方法不行 private int workbystep int op,int num1,int num2 else if op 1 else if op 2 else if op 3 只要沒有有小數生成,即使有負數也...
演算法二十四 矩形
給定兩個矩陣,判斷第二個矩陣在第乙個矩陣的哪些位置出現過。輸入的第一行包含四個正整數a,b,c,d,表示第乙個矩陣大小為a b,第二個矩陣的大小為c d。接下來是乙個a b的矩陣。再接下來是乙個c d的矩陣。保證矩陣中每個數字都為正整數且不超過100。若第二個矩陣在第乙個矩陣的 i,j 位置出現 即...