給出4個小於10的正整數,可以使用+-*/()的運算將這4個數連線起來得到乙個表示式。問,是否存在一種計算方式可以使表示式的結果為24。
輸入多行資料,每行包括4個小於10的正整數。最後一行資料為4個0,作為資料的終止。
對於每一組資料,如果可以得到24,則輸出「yes」,否則輸出「no」。
5 5 5 1
yes1 1 4 2
no0 0 0 0
這個問題就是我們所熟知的算24這個數學遊戲。我們先跳出如果用**實現這個問題,思考一下,當給我們4個數字時,我們是用什麼方式得出是否可以計算24這個問題。大部分人所用的方法都是連拼帶湊的方法得出結論的,即嘗試將幾個數字進行+-*/運算,拼湊出是否為24。如果將這種思想轉化為演算法思想,我們首先想出的便是列舉,即把數字兩兩計算,並且把所有的可能性都列舉出來,例如:我們已知a,b,c,d這4個數字,我們先嘗試a,b;a,c;a,d;b,c;b,d;c,d這6組數的+-*/,並把這6組數得出的結果與剩下的值重複進行上述的操作,直至剩餘最後2個數嘗試進行+-*/,看看是否能夠得出24這個值,如果最終的結果為24,那麼輸出yes,否則輸出no。
在編寫**的過程中,我們會發現,如果用非遞迴的方式寫**,將會巢狀好幾層for迴圈,且**顯得非常的冗餘,所以在迴圈重複計算時,我們引入遞迴的方式,減少冗餘的**量。且這題在解決多重迴圈的問題上,類似n皇后問題的處理方法。由於n皇后問題中的n引數未知,所以通過遞迴可以避免手寫n重迴圈的問題。本題其實已知迴圈的層數了,可以通過遞迴來提公升**的簡潔度。**實現難度相對不大。
#include #include using namespace std;
double a[5];//儲存錄入的4個引數
#define eps 1e-6
bool iszero(double x)//判斷是否為0
bool calculate24(double a, int n)
double b[5];//用於存陣列a中未計算的引數及完成計算的引數的值
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
if (!iszero(a[j]))
}return false;
}void main()
}
**細節簡評:
1)由於浮點數是不能用==來判斷兩個浮點數是否相等的,所以在這我們定義了乙個iszero(double x)函式進行判斷。通過2個浮點數相減絕對值小於 1e-16,來判斷2個浮點數是否相等。
2)在進行除法時,我們要判斷被除數是否為0
3)整體難度和思路的難度不算太大,但是碼量有點大,擼的時候要細心一點。
暴力遞迴列舉演算法 之 24點遊戲
你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 的運算得到 24。思想 1 第一次從列表中隨意取出兩個數,做四則運算後再放回列表,即從4個數變成3個數。2 從剩下三個數中,任取兩個數,做四則運算後放回,即從3個數變成2個數。3 將兩個數進行四則運算,如果結果是24 1e 6,則表明找到...
2 4演算法 列舉 梅森數
形如2n 1的素數稱為梅森數 mersenne number 例如2 2 2 3 1 7都是梅森數。1722年,雙目失明的瑞士數學大師尤拉證明了2 31 1 2147483647是乙個素數,堪稱當時世界上 已知最大素數 的乙個記錄。本題要求編寫程式,對任一正整數n n 20 輸出所有不超過2 n 1...
noi (百練)算24(列舉 遞迴)
可有意思的一題了呢 描述給出4個小於10個正整數,你可以使用加減乘除4種運算以及括號把這4個數連線起來得到乙個表示式。現在的問題是,是否存在一種方式使得得到的表示式的結果等於24。這裡加減乘除以及括號的運算結果和運算的優先順序跟我們平常的定義一致 這裡的除法定義是實數除法 比如,對於5,5,5,1,...