求一个好的解决方法!
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; }