拆分自然数
大概思路:用一个变量记录当前搜索的步数m,枚举m步内的所有组合,为了保证唯一,按降序枚举
代码
void splitN(int n, int m)
{
for (int i = 1; i <= n; ++i)
{
if (x[m-1] >= i)
{
x[m] = i;
int rest = n - i;
if (rest || m == 1)
{
splitN(rest, m + 1);
}
else
{
++total;
printf("%d\t", total);
for (int j = 1; j < m; ++j)
{
printf("%d+", x[j]);
}
printf("%d\n", x[m]);
}
}
}
}
{
for (int i = 1; i <= n; ++i)
{
if (x[m-1] >= i)
{
x[m] = i;
int rest = n - i;
if (rest || m == 1)
{
splitN(rest, m + 1);
}
else
{
++total;
printf("%d\t", total);
for (int j = 1; j < m; ++j)
{
printf("%d+", x[j]);
}
printf("%d\n", x[m]);
}
}
}
}