【问题描述】自然数的拆分:任何一个大于1的自然数N,总可以拆分成若干个自然数之和,并且有多种拆分方法。例如自然数5,可以有如下一些拆分方法:
5=1+1+1+1+1
5=1+1+1+2
5=1+2+2
5=1+4
5=2+3
下面的代码改一处就可以实现,拆分成若干个不相同的自然数之和
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void divide(int n, int m, int *p);
void resolve(int n);
void resolve(int n)
{
int size;
int *p;
size = sizeof(int) *( n + 1);
p = (int *) malloc(size);
memset(p, 0, size);
divide(n, 1, p);
}
void divide(int n, int m, int *p)
{
int i;
for (i = 1; i <= n; i++) {
if (p[m - 1] <= i) {
if (n - i == 0) {
int j;
p[m] = i;
for (j = 1; j <= m; j++) {
printf("%d ", p[j]);
}
printf("\n");
return;
}
else {
p[m] = i;
divide(n - i, m + 1, p);
}
}
p[m] = 0;
}
}
int main(int argc, char *argv[])
{
resolve(atoi(argv[1]));
return 0;
}