趣味集算 算二十四

2021-08-22 04:28:44 字數 2553 閱讀 7011

算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 位置出現 即...