打印从小于等于n的正整数选k的所有组合。
static unsigned int num[100];
static unsigned int sum=0;
int printcomp(unsigned int n, unsigned int k){
for(int i=n;i>0;i--){
num[sum]=i;sum++;
if(k==1){
for(int j=0;j<100;j++){
if(!num[j]) break;
cout<<num[j]<<" ";
}
cout<<endl;
}
else if(i>=k) printcomp(i-1,k-1);
sum--;
num[sum]=0;
}
return 1;
}
int main()
{
memset(num,0,sizeof(num));
printcomp(100,3);
}
/*非递归算法------------------------------------------------------------------------------------------------------------------------------*/
int printcomp_for(unsigned int n, unsigned int k){
static char direction;
unsigned int i,j,m,tt;
num[0]=n+1;cc=0;
i=1;direction='f';
while(i){
if(i==k) {
for(j=num[i-1]-1;j>0;j--){
cout<<cc++<<":";
for(m=1;m<k;m++) cout<<num[m]<<" ";
cout<<j;
cout<<endl;
}
i--;direction='b';
}
else {
if(direction=='f') tt=num[i-1]-1;
else tt=num[i]-1;
if(tt>=(k-i)) {num[i]=tt;i++;direction='f';}
else {i--;direction='b';}
}
}
return 1;
}