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;
}

代码解释:

  1. split 函数:
  • n:待拆分的数字
  • arr:存储拆分结果的数组
  • i:数组的当前索引
  • n 等于 0 时,表示已完成拆分,输出数组中所有元素
  • n 大于 0 时,从 n 到 1 遍历所有可能的拆分值 j
  • j 放入数组 arr 中,递归调用 split 函数,继续拆分 n - j
  1. main 函数:
  • 输入待拆分的数字 n
  • 初始化一个大小为 10 的数组 arr
  • 调用 split 函数,开始拆分

算法思路:

  • 使用递归函数 split 实现拆分功能
  • 递归的终止条件是 n 等于 0,表示已完成拆分
  • 每次递归调用都会尝试不同的拆分值 j,并将 j 加入数组中
  • 递归调用结束后,将 j 从数组中移除,尝试下一个拆分值
  • 由于递归调用顺序是从 n 到 1,因此输出的拆分组合将按照从大到小的顺序排列

注意:

  • 数组 arr 的大小应足够大,以存储所有可能的拆分结果
  • 递归的深度取决于 n 的值,如果 n 很大,可能会出现栈溢出错误
  • 该代码仅提供基本功能,用户可以根据自己的需求进行修改和扩展。
C语言递归实现正整数拆分组合算法

原文地址: https://www.cveoy.top/t/topic/lfPX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录