本文實例為大家分享了C語言經典24點算法的具體實現代碼,供大家參考,具體內容如下
創新互聯公司主營長洲網站建設的網絡公司,主營網站建設方案,成都app軟件開發,長洲h5重慶小程序開發公司搭建,長洲網站營銷推廣歡迎長洲等地區企業咨詢1、概述
給定4個整數,其中每個數字只能使用一次;任意使用 + - * / ( ) ,構造出一個表達式,使得最終結果為24,這就是常見的算24點的游戲。這方面的程序很多,一般都是窮舉求解。本文介紹一種典型的算24點的程序算法,并給出兩個具體的算24點的程序:一個是面向過程的C實現,一個是面向對象的java實現。
2、基本原理
基本原理是窮舉4個整數所有可能的表達式,然后對表達式求值。
表達式的定義: expression = (expression|number) operator (expression|number)
因為能使用的4種運算符 + - * / 都是2元運算符,所以本文中只考慮2元運算符。2元運算符接收兩個參數,輸出計算結果,輸出的結果參與后續的計算。
由上所述,構造所有可能的表達式的算法如下:
(1) 將4個整數放入數組中
(2) 在數組中取兩個數字的排列,共有 P(4,2) 種排列。對每一個排列,
(2.1) 對 + - * / 每一個運算符,
(2.1.1) 根據此排列的兩個數字和運算符,計算結果
(2.1.2) 改表數組:將此排列的兩個數字從數組中去除掉,將 2.1.1 計算的結果放入數組中
(2.1.3) 對新的數組,重復步驟 2
(2.1.4) 恢復數組:將此排列的兩個數字加入數組中,將 2.1.1 計算的結果從數組中去除掉
可見這是一個遞歸過程。步驟 2 就是遞歸函數。當數組中只剩下一個數字的時候,這就是表達式的最終結果,此時遞歸結束。
在程序中,一定要注意遞歸的現場保護和恢復,也就是遞歸調用之前與之后,現場狀態應該保持一致。在上述算法中,遞歸現場就是指數組,2.1.2 改變數組以進行下一層遞歸調用,2.1.3 則恢復數組,以確保當前遞歸調用獲得下一個正確的排列。
括號 () 的作用只是改變運算符的優先級,也就是運算符的計算順序。所以在以上算法中,無需考慮括號。括號只是在輸出時需加以考慮。
3、面向過程的C實現
這是 csdn 算法論壇前版主海星的代碼,程序非常簡練、精致:
#include #include #include using namespace std; const double PRECISION = 1E-6; const int COUNT_OF_NUMBER = 4; const int NUMBER_TO_BE_CAL = 24; double number[COUNT_OF_NUMBER]; string expression[COUNT_OF_NUMBER]; bool Search(int n) { if (n == 1) { if ( fabs(number[0] - NUMBER_TO_BE_CAL) < PRECISION ) { cout << expression[0] << endl; return true; } else { return false; } } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double a, b; string expa, expb; a = number[i]; b = number[j]; number[j] = number[n - 1]; expa = expression[i]; expb = expression[j]; expression[j] = expression[n - 1]; expression[i] = '(' + expa + '+' + expb + ')'; number[i] = a + b; if ( Search(n - 1) ) return true; expression[i] = '(' + expa + '-' + expb + ')'; number[i] = a - b; if ( Search(n - 1) ) return true; expression[i] = '(' + expb + '-' + expa + ')'; number[i] = b - a; if ( Search(n - 1) ) return true; expression[i] = '(' + expa + '*' + expb + ')'; number[i] = a * b; if ( Search(n - 1) ) return true; if (b != 0) { expression[i] = '(' + expa + '/' + expb + ')'; number[i] = a / b; if ( Search(n - 1) ) return true; } if (a != 0) { expression[i] = '(' + expb + '/' + expa + ')'; number[i] = b / a; if ( Search(n - 1) ) return true; } number[i] = a; number[j] = b; expression[i] = expa; expression[j] = expb; } } return false; } void main() { for (int i = 0; i < COUNT_OF_NUMBER; i++) { char buffer[20]; int x; cin >> x; number[i] = x; itoa(x, buffer, 10); expression[i] = buffer; } if ( Search(COUNT_OF_NUMBER) ) { cout << "Success." << endl; } else { cout << "Fail." << endl; } }
另外有需要云服務器可以了解下創新互聯建站vcdvsql.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網頁標題:C語言實現經典24點算法-創新互聯
鏈接地址:http://vcdvsql.cn/article16/phedg.html
成都網站建設公司_創新互聯,為您提供ChatGPT、全網營銷推廣、網站制作、品牌網站建設、網頁設計公司、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯