C语言递归实现正整数拆分组合算法
C语言递归实现正整数拆分组合算法
本程序使用递归算法实现输入一个正整数n (2<=n<=10),求该数的所有不同拆分组合的功能,要求拆分组合不能重复,例如:2+4 和 4+2 视为重复。
输入格式: 输入一个正整数n (2<=n<=10)
输出格式: 输出所有不同的拆分组合,其中被拆分的数据按从大到小的顺序输出,输出的所有符号中间不存在空格,每一种拆分按一行输出。
输入样例: 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
#include <stdio.h>
void split(int n, int *arr, int i) {
if (n == 0) {
for (int j = 0; j < i; j++) {
if (j != 0) {
printf("+");
}
printf("%d", arr[j]);
}
printf("\n");
} else if (n > 0) {
for (int j = n; j >= 1; j--) {
arr[i] = j;
split(n - j, arr, i + 1);
}
}
}
int main() {
int n;
scanf("%d", &n);
int arr[10] = {0};
printf("%d=", n);
split(n, arr, 0);
return 0;
}
代码解释:
- split 函数:
n:待拆分的数字arr:存储拆分结果的数组i:数组的当前索引- 当
n等于 0 时,表示已完成拆分,输出数组中所有元素 - 当
n大于 0 时,从n到 1 遍历所有可能的拆分值j - 将
j放入数组arr中,递归调用split函数,继续拆分n - j
- main 函数:
- 输入待拆分的数字
n - 初始化一个大小为 10 的数组
arr - 调用
split函数,开始拆分
算法思路:
- 使用递归函数
split实现拆分功能 - 递归的终止条件是
n等于 0,表示已完成拆分 - 每次递归调用都会尝试不同的拆分值
j,并将j加入数组中 - 递归调用结束后,将
j从数组中移除,尝试下一个拆分值 - 由于递归调用顺序是从
n到 1,因此输出的拆分组合将按照从大到小的顺序排列
注意:
- 数组
arr的大小应足够大,以存储所有可能的拆分结果 - 递归的深度取决于
n的值,如果n很大,可能会出现栈溢出错误 - 该代码仅提供基本功能,用户可以根据自己的需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/lfPX 著作权归作者所有。请勿转载和采集!