c语言代码题 自然数的拆分问题CF [3*] 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N 1 Output 所有的拆分情况.按由大到小的顺序排列。 Sample Input 6 Sample Output 6=6 6=5+1 6=4+2 6=4+1+1 6=3+3 6=3+2+1 6=3+1+1+1 6=2+2+2 6=2+2+1+1 6=2+1+1+1+1 6=1+1+1+1+1+1
时间: 2023-10-30 21:06:01 浏览: 124
这是一个比较经典的搜索算法问题,可以用递归来实现。对于一个大于 1 的自然数 $N$,可以枚举它的最大加数 $k$,然后递归地求解 $N-k$ 的拆分情况,最后将 $k$ 加到所有的结果中。需要注意的是,对于拆分 1 的情况,不需要再往下递归了。
下面是一个 C 语言的实现:
```c
#include <stdio.h>
int n;
int path[100];
void dfs(int target, int max) {
if (target == 0) {
for (int i = 0; i < n-1; i++) {
printf("%d+", path[i]);
}
printf("%d\n", path[n-1]);
return;
}
for (int i = max; i >= 1; i--) {
if (target >= i) {
path[n++] = i;
dfs(target - i, i);
n--;
}
if (i == 1) {
break;
}
}
}
int main() {
scanf("%d", &n);
dfs(n, n);
return 0;
}
```
输入样例:
```
6
```
输出样例:
```
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
```
阅读全文