乘法的計算順序(乘法加括號問題)
阿新 • • 發佈:2018-12-14
乘法運算對於一般的資料都有結合性,比如一般的常數乘法:,這是滿足結合律的,而對於特殊資料的乘法,比如矩陣乘法,不同的計算順序可能會有不同的計算複雜度。所以計算順序就很重要,這是這個問題提出的背景,而我們要列舉出所有的計算順序也就是給乘法式加括號,比如(A(B(C(DE))))這是其中的一種。
那麼我們如何找到所有的加括號的方法呢?下面給出程式碼:
#include <iostream> #include <vector> #include <string> using namespace::std; vector<string> resolve(vector<char>& charactor, int s, int e); int main() { int n; cin >> n; vector<char> charactor; for (int i = 0; i < 26; i++) { charactor.push_back('A' + i); } vector<string> ans = resolve(charactor,0, n - 1); for (int i = 0; i < ans.size(); i++){ cout << ans[i] << endl; } return 0; } vector<string> resolve(vector<char>& charactor, int s, int e) { if (s == e) { string to; to += charactor[s]; vector<string> back; back.push_back(to); return back; } else { vector<string> ans; for (int i = s; i < e; i++) { vector<string> subans1 = resolve(charactor, s, i); vector<string > subans2 = resolve(charactor, i+1, e); for (int i = 0; i < subans1.size(); i++) { for (int j = 0; j < subans2.size(); j++) { string astr; astr += '('; astr += subans1[i]; astr += subans2[j]; astr += ')'; ans.push_back(astr); } } } return ans; } }
結果如下:
5 (A(B(C(DE)))) (A(B((CD)E))) (A((BC)(DE))) (A((B(CD))E)) (A(((BC)D)E)) ((AB)(C(DE))) ((AB)((CD)E)) ((A(BC))(DE)) (((AB)C)(DE)) ((A(B(CD)))E) ((A((BC)D))E) (((AB)(CD))E) (((A(BC))D)E) ((((AB)C)D)E)
4 (A(B(CD))) (A((BC)D)) ((AB)(CD)) ((A(BC))D) (((AB)C)D)