您的位置:首页 > 编程语言

组合数的生成(代码加解释)

2013-04-17 11:16 253 查看
# include <stdio.h>
//生成从1-n中取m个数的组合,组合从小到大
void born(int n, int m)
{
int i, j, temp;
int a[100];
for (i = 0; i<m; i++)	//初始化第一个组合并输出
{
a[i] = i+1;
printf("%d", a[i]);
}
printf("\n");
i = 0;
//循环终止条件:当组合中第一个数不小于它所能成为的最大值时,退出循环
while (a[i]<n-m+i+1 || i!= 0)
{
temp = 0;	//用来判断组合中是否有数已经达到它的最大值
for (j = 0; j<m; j++)
{
if (a[j]>=n-m+j+1) //组合中有数达到了最大值,temp=1,终止循环
{
temp = 1;
break;
}
}
i = j-1;
a[i]+=1;	//当前应该改变的数+1
if (temp)	//有数达到最大值
{
if (i == 0)		//如果达到最大值的数是第一个,让之后的数为a[i]+1,a[i]+2......
{
for (j = 1; j<m; j++)
a[j] = a[i]+j;
}
a[i+1] = a[i]+1;
temp = 0;
}
for (j = 0; j<m; j++)		//输出组合数
printf("%d", a[j]);
printf("\n");
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
born(n, m);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: