题目描述:
列出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;
}
评论