|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 yipwing 于 2011-9-26 22:36 编辑
将一个正整数分解为多个正整数(相加)之和,其中前一个加数不小于后一个加数,列出每种可能的加数组合中的所有加数。而且加数不能重复;限制几个数相加,限制最小数,最大数,要求把结果输出到output.txt
例: 分解数为9,只能是3个数相加,最小数1,最大数5. 要求以传递参数方式..
结果:
9
5+3+1
4+3+2
这个是我的代码,希望各位大牛们给个更好的算法。。。小弟在这里先谢了。。。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void filewrite(int* a,int top2)
- {
- int i;
- FILE *pFile;
- pFile=fopen("output.txt","a+");
- for(i=0; i<top2-1; i++)
- {
- fprintf(pFile,"%d+",a[i]);
- }
- fprintf(pFile,"%d\n",a[i]);
- fclose(pFile);
- return;
- }
- void partion(int top1,int top2,int limit,int *a,int count,int min,int max)
- {
- int i=0;
- if(top1==0) //如果s1中已无元素,则划分完毕,输出
- {
- if(limit==count) //限制显示结果为输入的个数
- filewrite(a,top2);
- }
- else
- {
- for(i=top1; i>=1; i--)
- {
- if(top2==0||i<=a[top2-1])
- {
- a[top2]=i; //从s1中取出的1的个数压入s2
- if(a[top2]!=a[top2-1] && a[top2] <= max && a[top2] >= min ) //比较是否和之前的值一样,如果一样就跳过递归,重新调用一次递归
- {
- partion(top1-i,top2+1,limit,a,count+1,min,max); //对s1中剩下的1再次进行取栈操作
- }
- }
- }
- }
- }
- int Param;
- int main(int argc,char ** argv)
- {
- int top1,top2,limit,count,min,max; //
- int *a;
- FILE *pFile;
- pFile= fopen("output.txt","w");
- if(pFile!=NULL)
- fclose(pFile);
- top1=atoi(argv[1]); // 分解数
- limit=atoi(argv[2]); // 限制个数
- min=atoi(argv[3]); // 最小数
- max=atoi(argv[4]); // 最大数
- Param=1;
- while(Param--==1&&top1>=0)
- {
- top2=0;
- count=0;
- a=(int *)malloc(top1*sizeof(int));
- printf("--------------Start--------------\n");
- partion(top1,top2,limit,a,count,min,max);
- }
- return 0;
- }
复制代码
|
|