拆分自然数:任何一个大于1的数,总能够拆分成若干个小于n的自然数之和,求出所有拆分后的情况。
递归算法:
#include<stdio.h>
int num[20];
void print(int j)
{
int i;
printf("%d = %d ", num[0], num[1]);
for(i = 2; i <= j; i ++)
{
printf("+ %d", num[i]);
}
printf("\n");
return;
}
void split(int k, int m)
{
int i;
if(m <= 0)
{
print(k);
}
else
{
for(i = num[k]; i <= m; i ++)
{
if(i >= num[k])
{
num[k + 1] = i;
split(k + 1, m - num[k + 1]);
}
}
}
return;
}
int main(void)
{
int n, i;
scanf("%d", &num[0]);
for(i = 1; i <= num[0] / 2; i ++)
{
num[1] = i;
split(1, num[0] - num[1]);
}
return 0;
}
回溯算法:
#include<stdio.h>
int n, num[20];
void print(int k)
{
int i;
printf("%d = %d ", n, num[1]);
for(i = 2; i <= k; i ++)
{
printf("+ %d", num[i]);
}
printf("\n");
return;
}
void split(int n, int digit)
{
int i, remainder;
for(i = 1; i <= n; i ++)
{
if(i >= num[digit - 1])
{
num[digit] = i;
remainder = n - i;
if(remainder == 0 && digit > 1)
{
print(digit);
}
else
{
split(remainder, digit + 1);
}
num[digit] = 0;
}
}
}
int main(void)
{
scanf("%d", &n);
split(n, 1);
return 0;
}