求一个好的解决方法!
1.编写一个程序,输出所有自然数之和为20的等式,要求,等式中的每个加数因子不能相同! 例如: 1+2+17=20;是合法的。而10+10就不合法!
程序代码:#include<stdio.h>
int a[100];
int qiuhe(int *q,int n) //求和函数
{int i,he=0;
for(i=0;i<n;i++)
he+=q[i];
return he;
}
void zhonglei(int j,int k)
{int i,sum;
sum=qiuhe(a,j);
if(20==sum&&j!=1) //符合条件的输出
{
for(i=0;i<j;i++)
{printf("%d",a[i]);
if(i<j-1)
printf("+");
}
printf("=20\n");
}
else
{
for(i=k;i<=20;i++) //不回溯递归
{
a[j]=i;
zhonglei(j+1,k+1);
++k;
}
}
}
void main()
{
zhonglei(0,0);
}如有更好的算法希望指教

程序代码:#include<stdio.h>
#include<math.h>
void decompose(int n)
{
static int *p, sn, deep = 0;
int i;
if(!deep)
{
if(n < 3) return;
p = (int *)malloc(sqrt(n) * 2 * sizeof(int));
sn = n;
}
if(!n)
{
if(deep <= 1) return;
for(printf("%d", p[0]), i = 1; i < deep; printf("+%d", p[i++]));
printf("=%d\n", sn);
return;
}
for(i = deep ? p[deep - 1] + 1 : 1; i <= n; i++)
{
if(n - i <= i) i = n;
p[deep++] = i;
decompose(n - i);
deep--;
}
if(!deep) free(p);
}
int main()
{
int n;
for(; printf("\nInput number (0 for exit): "), scanf("%d", &n), n; decompose(n));
return 0;
}
