自然数的拆分

906 词

题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14

输入

输入一个待拆分的整数N(N<=8)。

输出

输出各种拆分的方案。

样例输入

1
4

样例输出

1
2
3
4
1+1+1+1
1+1+2
1+3
2+2

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
int n;
int a[100000] = {
1
};
//输入的数的值的范围未给出,应该开大一些,但对于较大数据的测试,这种方法就有些不好了;
void print(int t) {
if (t == 1) {
return;
}
for (int i = 1; i < t; i++) {
cout << a[i] << "+";
}
cout << a[t] << endl;
}
int search(int t, int s) {
for (int i = 1; i <= s; i++) {
if (a[t - 1] <= i) {
a[t] = i;
t++;
s = s - i;
if (s == 0) {
print(t - 1);
}
else {
search(t, s);
}
s = s + i;
t--;
}
}
}
int main() {
cin >> n;
search(1, n);
return 0;
}