实验:
4 = 4
4 = 3 + 1
4 = 2 + 2
4 = 2 + 1 + 1
4 = 1 + 1 + 1 +1
===================================
#include <conio.h>
#include <stdio.h>
#define MAXN 100
int a[MAXN];
int r[MAXN];
void rd(int n, int k) //递归法
{
int j = 0;
int i = 0;
for (j = (n<a[k-1]? n:a[k-1]); j >= 1; j--)
{
a[k] = j;
if (j == n)
{
printf("%d = %d", a[0], a[1]);
for (i = 2; i <= k; i++)
{
printf("+%d", a[i]);
}
printf("\n");
}
else
{
rd(n-j, k+1);
}
}
}
void nd(int n) //非递归法
{
int i = 0;
int k = 0;
r[0] = n;
do
{
if (r[k] == 0)
{
printf("%d = %d", a[0], a[1]);
for (i = 2; i <= k; i++)
{
printf("+%d", a[i]);
}
printf("\n");
while (k>0 && a[k]==1)
{
k--;
}
if (k > 0)
{
a[k]--;
r[k]++;
}
}
else
{
a[k+1] = a[k]<r[k]? a[k]:r[k];
r[k+1] = r[k] - a[k+1];
k++;
}
} while (k > 0);
}
int test_data[] = {3,4,5};
void main()
{
int i = 0;
for (i =0; i <sizeof(test_data)/sizeof(int); i++)
{
a[0] = test_data[i]; //a[0]存放将要分解的数
rd(test_data[i], 1);
printf("\n---------\n\n");
//nd(test_data[i]);
//printf("\n---------\n\n");
}
_getch();
return 0;
}