📄 计算下一个组合的c语言源代码.txt
字号:
计算下一个组合的C语言源代码[原创]
以前写过几个关于求任意组合的代码,有兴趣的朋友可以比较一下:
http://bugeyes.blog.edu.cn/user1/20989/archives/2005/264294.shtml
http://bugeyes.blog.edu.cn/user1/20989/archives/2005/302729.shtml
http://bugeyes.blog.edu.cn/user1/20989/archives/2006/1113179.shtml
从n个数中取r个数的组合,假设c1c2c3...cr是其中一个组合,则计算其下一个组合的算法如下:
Step 1:求满足不等式cj<n-r+j的最大坐标,并设为i。即i=max{j | cj<n-r+j}
Step 2:设置ci=ci+1
Step 3:设置cj=cj-1+1,对于j=i+1,i+2,i+3,...,r
下面的代码演示了从任意n个符号中取r个符号的组合的过程,其中在计算某组合的下一个组合时利用了上面的算法。
#i nclude <conio.h>
int fun(int choice[],int r,int n)
{//利用了上面的算法,计算下一个组合
int i,j;
for(i=r-1;i>=0;i--)
if(choice[i]<n-r+i)
break;
if(i<0)//已经是最后一个了
return 0;
choice[i]+=1;
for(j=i+1;j<r;j++)
choice[j]=choice[j-1]+1;
return 1;//还有后续组合
}
void comb(char source[],int total,int count)
{
int choice[5];
int i;
for(i=0;i<count;i++)//人工设置第一个组合
choice[i]=i;
do
{
printf("\n");
for(i=0;i<count;i++)
{//输出当前组合
int t=choice[i];
printf("%c ",source[t]);
}
}while(fun(choice,count,total));
}
void main()
{
char array[5]={'a','b','c','d','e'};
clrscr();
comb(array,5,2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -