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
C语言代码实现:
#include <stdio.h>
void Split(int n, int sum)
{
if (n == 0)
{
printf("%d", sum);
return;
}
else
{
for (int i = n; i > 0; i--)
{
printf("%d+", i);
Split(i - 1, sum - i);
printf("\n");
}
}
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
Split(n, n);
}
return 0;
}
算法思路:
- 使用递归函数
Split(n, sum),其中n表示当前需要拆分的数字,sum表示已经拆分的数字之和。 - 当
n等于 0 时,表示已经完成了拆分,输出sum。 - 当
n不等于 0 时,从n到 1 进行循环,对于每个i,打印i+,然后递归调用Split(i - 1, sum - i),继续拆分剩余的数字。 - 每次递归调用之后,输出一个换行符。
代码解释:
Split(n, sum)函数:- 递归出口:当
n等于 0 时,表示已经完成了拆分,输出sum。 - 递归步骤:当
n不等于 0 时,从n到 1 进行循环,对于每个i,打印i+,然后递归调用Split(i - 1, sum - i),继续拆分剩余的数字。
- 递归出口:当
main()函数:- 从标准输入读取一个整数
n,并调用Split(n, n)函数进行拆分。
- 从标准输入读取一个整数
总结: 该代码使用递归算法实现了正整数拆分组合的功能,并通过循环和递归调用实现了所有不同拆分组合的输出。代码清晰易懂,逻辑结构简单,易于理解和维护。
原文地址: https://www.cveoy.top/t/topic/lfPR 著作权归作者所有。请勿转载和采集!