一个数的拆分问题
问题描述:将一个正数进行拆分,比如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); } } }