1. 程式人生 > >乘法的計算順序(乘法加括號問題)

乘法的計算順序(乘法加括號問題)

乘法運算對於一般的資料都有結合性,比如一般的常數乘法:(a*b)*c = a*(b * c),這是滿足結合律的,而對於特殊資料的乘法,比如矩陣乘法,不同的計算順序可能會有不同的計算複雜度。所以計算順序就很重要,這是這個問題提出的背景,而我們要列舉出所有的計算順序也就是給乘法式加括號,比如(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)