一个数的拆分问题

问题描述:将一个正数进行拆分,比如n=3 输出:(1+1+1,1+2,2+1,3)

这个问题想了一下午才想透,利用递归可以进行解决。使用一个辅助数组来保存每一次递归的值。

思路如下(输入n=3):

  1、对于第一位的数字,应当从1遍历到3(即n,遍历index设为i),形式如:1+...., 2+.... ,n

  2、对于第二位数字,是n-i这个数的遍历结果(递归)

  3、需要保存下来遍历过程中的因子,便于输出整个中间结果数组

  4、递归停止条件:如果n-i已经等于0,意味着可以打印输出了

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
int total = 0;
int n;
int * p = (int *)malloc(n * sizeof(int));//申请n个空间,最大保存所有都是1的情况
void chf (int a, int m);
int main (void)
{
    printf ("请输入一个数:");
    scanf("%d", &n);
    chf (n, 1);
    system("pause");
    return 0;
}
void chf (int a, int m) //a是当前要分解的数,0-m是数组输出的位置,也可以说成是递归的深度
{
    int rest, j, i;
    for (i = 1; i <= a; i++)
    {
        p[m] = i;
        rest = a - i;

        if (rest == 0)
        {
            for (j = 1; j < m; j++)
            {
                printf("%d+", p[j]);
            }
            printf("%d\n", p[m]);
        }
        else
        {
            chf(rest, m +1);
        }
    }

}
posted on 2012-10-06 17:34  暗夜的雪  阅读(268)  评论(0编辑  收藏  举报