我曾参加一个公司的面试 要求打印出1~26 数之间所有5个数的组合
比如我要打印 1~7之间所有的 4的组合数
就是
如 1234 1235 1236 1237 1245 1246..................
一共(7!)/(4!)*(3!)个数 网上搜到的比较复杂 我的朋友也曾写了一个 还是复杂
我想了好久 在某天早上灵光一闪些出一个简单的非递归的组合数算法
借此与大家分享
并求一个第归的组合数算法
以下注解:
m个数中选取k 的组合数 combin(m,k)
主函数:
<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define NUM 4
int array[MAX];
void combin(int m,int k);
void MyPrinf(int array[] , int k);
void main()
{
combin( 7, NUM); /**/35
for(int i=0;i<NUM;i++)
printf("%d",array[i]);
system("pause");
}
函数实现:
//打印出组合数
void MyPrinf(int array[] , int k)
{
for(int i=0;i<k;i++)
{
printf("%d",array[i]);
}
printf("\n");
}
void combin(int m,int k)
{
int i;
for(i=0;i<50;i++)array[i]=0;
int j=0;
while(j>=0)
{
if(array[j]<(m-k+j+1))
{
i=j;
array[j]++;
}
else
{
j--;
continue;
}
for(;i<k-1;i++)
{
array[i+1]=array[i]+1;
}
if(i==k-1)
{
MyPrinf(array,k);
}
j=i;
}
}
![吐舌头](http://static.blog.csdn.net/xheditor/xheditor_emot/default/tongue.gif)