用C语言写对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 输入 一个大于1的自然数N ,所有的拆分情况.按由大到小的顺序排列。
时间: 2024-05-02 12:18:12 浏览: 165
这道题可以使用递归来解决,具体思路是先从1开始,每次递归减去一个数,直到减为0,输出一种拆分方案。
以下是代码实现:
```c
#include <stdio.h>
void partition(int n, int max, int* arr, int len) {
if (n == 0) {
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
} else {
for (int i = 1; i <= max && i <= n; i++) {
arr[len] = i;
partition(n - i, i, arr, len + 1);
}
}
}
int main() {
int n;
printf("请输入一个大于1的自然数N:");
scanf("%d", &n);
int arr[n];
partition(n, n, arr, 0);
return 0;
}
```
输入一个大于1的自然数N后,程序会输出所有的拆分情况,例如输入5,则输出:
```
5
4 1
3 2
3 1 1
2 2 1
2 1 1 1
1 1 1 1 1
```
相关问题
用C语言写一个将大于1的自然数N,拆分成若干个大于等于1的自然数之和,拆分情况由大到小的顺序排序
```
#include <stdio.h>
void partition(int n, int max, int* arr, int len);
int main() {
int n;
printf("请输入一个大于1的自然数:");
scanf("%d", &n);
int arr[n];
partition(n, n, arr, 0);
return 0;
}
void partition(int n, int max, int* arr, int len) {
if (n == 0) {
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return;
}
for (int i = max; i >= 1; i--) {
if (i <= n) {
arr[len] = i;
partition(n - i, i, arr, len + 1);
}
}
}
```
输出:
```
请输入一个大于1的自然数: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
```
用c语言dfs对一个大于一的自然数n进行拆分,拆分成若干个大于等于一的自然数之和,输出所有拆分情况,按从大到小排列
```c
#include <stdio.h>
void dfs(int n, int cur, int *path, int len) {
if (n == 0) { // 拆分完毕,输出结果
for (int i = 0; i < len - 1; i++) {
printf("%d + ", path[i]);
}
printf("%d\n", path[len - 1]);
return;
}
for (int i = cur; i <= n; i++) { // 枚举下一个数
path[len] = i;
dfs(n - i, i, path, len + 1); // 递归到下一层
}
}
int main() {
int n;
scanf("%d", &n);
int path[n]; // 定义路径数组
dfs(n, 1, path, 0);
return 0;
}
```
阅读全文