题目描述:列出C(a,b)的所有组合 输入:多组测试数据,每组一行有两个数字a和b(1<=b<a<=30)输入的a=b=0的时候结束。 输出:输出从1到a的数中选出b个数的所有组合,一行输出一个组合,每个组合里的数从小到大排列,各组之间按字典顺序从小到大排列。 样例输入:5 20 0 样例输出:1 21 31 41 52 32 42 53 43 54 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; }

评论