其实哥们也是新手,写不对地方见谅。
我对这道题想将一个整数细化,先拆1,2,3……
注意这道题4=3+1与4=1+3是不同情况,如果特别要求还是得判断了
int a[10] = { 0 };
void fun(int n,int k)
{
if (n == 0)
{
for (int h=0;;h++)
{
if (a[h] == 0)
{
a[k]=0; break;
//注意,我自认为这道题难点就在这里,这个k的定义,打完后清除这个数
怎么说呢?比如上一次输出了1,1,1第二次1,2后面可能还有一个1,这个k可以清除了这个
}
printf("%d", a[h]);//输出a[n]
}
printf("\n");
}
if (n >= 1)
{
for (int i = 1; i <= n; i++)
{
if (k == 0 && i == n)continue;//跳过4=4这种情况
a[k] = i;
fun(n - i, k + 1);//写出 n-k 之后的排列
a[k] = 0;
}
}
}
完整代码
#include<stdio.h>
int a[10] = { 0 };
void fun(int n,int k)
{
if (n == 0)
{
for (int h=0;;h++)
{
if (a[h] == 0)
{
a[k]=0; break;
}
printf("%d", a[h]);
}
printf("\n");
}
if (n >= 1)
{
for (int i = 1; i <= n; i++)
{
if (k == 0 && i == n)continue;
a[k] = i;
fun(n - i, k + 1);//写出 n-k 之后的排列
a[k] = 0;
}
}
}
int main()
{
int k = 0;
fun(6,k);
}
k=0,不要动
我觉得也可以尝试用二维数组存储输出