啊,题目并没有要求我们必须列出来啊,偷懒可是我的一大特长~
[此贴子已经被作者于2004-07-25 10:39:22编辑过]
各位,不好意思,程序有点错误,我已经做了如下修改!上一个程序对k=2的情况有异常,会陷入死循环,我已经把
这个情况进行了解决。
请看如下程序,这回没有错误了!无限歉意!!!
#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) { if(k==2) { 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 break; } 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()
//--------------------------四海为家作品---------
我把自己的代码也贴出来吧,再WUN-TC下编译通过:
int count=0,k; /*count 为计数函数*/ void do1(int min,int max,int left,int c) /*递归函数*/ { int i,l,m;
if(c==1)count++ ;
else for(i=min;i<=max;i++) /*搜索范围是优化代码的关键*/
{l=left-i;m=l/(c-1);do1(i,m,l,(c-1));}} /*最小值为前一个数,最大值为剩下的数除以剩下的数字的个数*/ main() {int n,i=1,j=1;
while(i) {printf("Input the number\n"); scanf("%d",&n); if(n>6&&n<=200)i=0; else printf("The number must be bigger than 6 and smaller than 200!\n");}
while(j){ printf("Input the how many parts you want:\n"); scanf("%d",&k); if(k>=2&&k<=6)j=0; else printf("The part must be more than 2 and less than 6!\n");} do1(1,(n/k),n,k); printf("There are %d posibilities.",count);getch();}