2004的方法也不错,实现我这道题的要求很有用,但如果要求打印结果的话……
所以还是觉得排序好。出这道题的目的就是想让大家多思考一下,体会一下好的算法,
好了如果需要的话我可以把自己的代码贴上来(如果那位兄弟想自己试试,我就先不贴了)
我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
//算法介绍:此程序用了一维数组来存储输出的变量,我首先找到了数字的分布规律 /*比如7 分成三分的组合有: 1 1 5 1 2 4 1 3 3 2 2 3 程序要保证数字没有重复,我采用了最末位的数组存储最大值,先位不能大于后一位 这样才保证了数字无重复。其次每计算一轮,我就把数组按规律初始化一遍,这样就 完成了。程序还有很多不完善,希望大家来进行修正。 */
#include <stdio.h> #include <stdlib.h>
main() { int n,k,result[6],t,t1; //6为分的最大值 //t,t1为临时计数变量 printf("请输入n,k(用逗号分开):"); scanf("%d,%d",&n,&k); for(t=0;t<k;t++) result[t]=1; if(n<=6||n>200||k<2||k>6) { printf("\n输入不满足条件!\n"); exit(0); }
result[k-1]=n-k+1; while(result[0]<=n/k) { for(t1=k-3;t1>=0;t1--) { while(result[k-1]>=result[k-2]) { printf("输出:"); for(t=0;t<k;t++) { printf("%d ",result[t]); }//end for result[k-1]--; result[k-2]++; printf("\n"); }//end while result[t1]++; for(int d=t1;d<=k-2;d++) result[d]=result[t1]; //依次赋初值 int sum=0; for(int s=0;s<=k-2;s++) sum=sum+result[s]; result[k-1]=n-sum; //最高位计算赋值 } } return 0; }//end main()
//--------------------------四海为家作品---------
我也来贴一个
int n,k; long result=0; void recall(int x,int y,int g) { int i,m; for(i=g;i<=(x/(k+1-y));i++) { m=x-i; if(m>=i && y==k-1) result++; else if(y<k-1 && m>=i*(k-y)) recall(m,y+1,i); } }
main() { printf("\nPlease input n,k"); scanf("%d,%d",&n,&k); recall(n,1,1); printf("\n%d",result); }
你看,用了递归就这么简单
我试过了,在TC下也运行正常!不知道楼主有没有源程序?如果有请发到我的邮箱里!ythome@eyou.com
我也参考对比一下。