打印组合数

打印从小于等于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值