一个集合的算法问题的解决

qszhoufuge那里看到“一个集合的算法问题”题目如下:

    设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:1 2,1 3,1 4,2 3, 2 4,3 4。

    早上在家的时候随手写了一个用循环解决的,因为没环境测试,下午有时间的时候测试发现错了,哈哈。非常抱歉啊。

    后来一想,其实这个不难,用递归可以很好解决,于是乎就静下心来思考,其实用递归实现真的不复杂,这次终于一次性通过了,^_^

    实现算法如下(经过测试的):

#include <stdio.h>

//显示组合
//nCount:组合的个数
//p:数组指针
inline void p2s(int nCount,int *p)
{
         for (int i = 0;i<nCount;++i)
         {
                  printf("/t%d",*(p + i));
         }

         printf("/r/n");
}

//递归组合
//nStart 开始数
//nMax: 最大数值
//nCount:组合的个数
//nIndex:组合索引(组合中的第几个数,0开始)
//p:数组指针
void func0(int nStart,int nMax,int nCount,int nIndex,int * p)
{
         for (int i = nStart;i< nMax - nCount + nIndex + 2;i++)
         {
                  *(p + nIndex) = i;
                  if (nCount - 1 == nIndex)
                  {
                           p2s(nCount,p);
                  }
                  else
                  {
                           func0(i + 1,nMax,nCount,nIndex + 1,p);
                  }
        } 
}

//组合算法
//n:范围:1~n
//nCount:组合的个数
void func(int n,int k)
{
         int* p = new int[k];
         func0(1,n,k,0,p);
}

int _tmain(int argc, _TCHAR* argv[])
{
         func(4,2);
         getchar();//等待退出
         return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值