正文

组合2007-07-21 00:26:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27673.html

分享到:

题目描述:
列出C(a,b)的所有组合

输入:
多组测试数据,每组一行有两个数字a和b(1<=b<a<=30)
输入的a=b=0的时候结束。

输出:
输出从1到a的数中选出b个数的所有组合,一行输出一个组合,
每个组合里的数从小到大排列,各组之间按字典顺序从小到大
排列。

样例输入:
5 2
0 0

样例输出:
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

#include <stdio.h>

void putout(int s[],int b){
 int i;
 for(i=1; i < b; i++)
  printf("%d ",s[i]);
 printf("%d\n",s[i]);
}

int main(){
 int a,b,s[32],i;
 while(scanf("%d %d",&a,&b)!=EOF){
  if(a==0 && b==0)
   break;
  for(s[0]=i=1; i<=b; i++)
   s[i]=i;
  for(i--; i>0; ){
   if(i==b)
    putout(s,b);
   if(s[i]+1+b-i > a){
    if(i==1)
     break;
    for(;i>1 && s[i-1]+2+b-i>a;i--)
     ;
    if(i==1)
     continue;
    for(s[i-1]++; i<=b; i++)
     s[i]=s[i-1]+1;
    i--;
   }
   else if(i==1){
    for(s[i]++,i=2; s[i-1]<=a && i<=b; i++)
     s[i]=s[i-1]+1;
    if(i <= b)
     break;
    i--;
   }
   else{
    s[i]++;
    if(i<b)
     i++;
   }
  }         
 }
 return 0;  
}

 

阅读(2189) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册