趣味集算 算二十四

2021-09-02 00:10:53 字數 3422 閱讀 5370

算 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個數,計算出遊戲的解答,如下面的24poi...

二十四點演算法

給出四個數,不可以重複使用,可以用 和括號,怎麼得出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 位置出現 即...