分解整數, 列出所有加法組合
阿新 • • 發佈:2019-01-06
#include <vector> #include <iostream> using std::cin; using std::cout; using std::endl; // n: 待分解的數, m: 最大因子 void add_split_stub(std::vector<std::vector<int>>& rs, std::vector<int>& r, int n, int m) { if ((n < m) || (n < 0) || (m < 1)) return; if (n == 0) { rs.push_back(r); } else { if (n == m) { r.push_back(m); rs.push_back(r); r.pop_back(); } else { r.push_back(m); n = n - m; if (m > n) m = n; for (int i = m; i > 0; i--) { add_split_stub(rs, r, n, i); } r.pop_back(); } } } void add_split(std::vector<std::vector<int>>& results, int n, int m = -1) { if (n <= 0) return; if ((m <= 0) || (n < m)) m = n; std::vector<int> result; for (int i = m; i > 0; i--) { result.clear(); add_split_stub(results, result, n, i); } } void main(int argc, char **argv) { std::vector<std::vector<int>> results; add_split(results, 6); for (auto e1 : results) { for (auto e2 : e1) { cout << e2 << " "; } cout << endl; } cin.get(); }
結果如下
6
5 1
4 2
4 1 1
3 3
3 2 1
3 1 1 1
2 2 2
2 2 1 1
2 1 1 1 1
1 1 1 1 1 1