用集算器編寫算二十四

2021-06-22 19:50:28 字數 1675 閱讀 1831

算24點,是一種常見的智力遊戲。它可以使用抽去大小王的撲克牌來玩,隨便抽出4張牌,要求通過加、減、乘、除等四則運算,並使用所有的這4個數,將結果算為24。在撲克牌中,jqk記為11,12和13。

用集算器,可以比較方便地編寫程式,根據隨便給定的4個數,計算出這個遊戲的解答:

下面,詳細分析一下這段**。

計算使用的4個數在a1中給出。首先,在算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行和第6行的程式中,對於每種數的排列,迴圈每一種符號選擇,並迴圈所有的計算順序,呼叫a8中的子程式計算,計算時使用複製出的引數,以防止干擾後續的計算。

呼叫a8中的子程式時,數值串行、符號串行和計算順序序列,分別填到a8,b8,c8中,並在d8中準備計算使用的表示式。b9迴圈計算順序序列,逐步計算出結果。c9呼叫a13中的子程式,計算出單步的結果。a13中的子程式很簡單,就是根據給定的兩個數和中間的符號,計算出四則運算的結果。在d9中,把這1步計算使用的表示式計算出來。單步計算後,原來的2個數就變成了1個數,在e9、c10和d10中,調整單步計算後的表示式序列、符號串行和數值串行。單步計算完成後,原有的總計算步數就少了1步,還需要在e10中相應調整計算順序序列。在第11行,只要不是最後一步計算,都在新生成的表示式中新增括號,以保證計算順序。

b9的迴圈結束後,a8中的子程式就計算完了這種情況的表示式。在b18中判斷結果是否等於24,判斷時考慮到雙精度數的計算誤差,結果保留3位小數。如果結果等於24,說明當前這種組合可以滿足條件,在c12中,將使用的表示式放到b1中。

在所有的情況都迴圈完畢後,在a7中,如果發現b1中未填入任何表示式,則說明無解。

計算完成後,就可以在b1中檢視結果如下:

也可以不在a1中寫定計算使用的數值組合,而是用網格引數:

計算前設入網格引數:

計算後,b1中檢視到的結果如下:

算二十四的第四題

描述 輸入4個1 13的整數,不改變順序,且運算次序為先做第乙個運算,再做第二個運算,最後做第三個運算,即 a b c d 能否得到24。輸入 輸入4個1 13的整數。輸出 不改變4個整數的順序,且運算次序為先做第乙個運算,再做第二個運算,最後做第三個運算的情況下,能否得到24。如果能則輸出 yes...

C Builder構建算二十四點小遊戲

所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...

C Builder構建算二十四點小遊戲

所謂算二十四點可能是不少讀者朋友童年喜歡玩的撲克遊戲之一,玩法是 把一副撲克牌從a到10選出來均分成兩份,兩個小朋友各持乙份即可開始遊戲,每人隨機抽兩張出來組成四張牌,把這四張牌加減乘除湊成結果為二十四,先算出來的一方贏得對方的兩張牌,進行下一輪,如果都沒計算出來為和局,直到把對方所有的撲克牌全部繳...