设计c语言程序输出m个A,n个B可以组合成多少个不同排列的问题?
3个回答
展开全部
共有C(m+n,n)种可能,(C(X,Y)是组合数)
共有m+n个位置,从m+n个位置中选出n个位置,放B就可以了.
经过排序后得到:
AABB ABAB ABBA BAAB BABA BBAA
定义一个函数fun(char ch[]);
fun("AABB")等于"ABAB",
fun("ABAB")等于"ABBA",
……
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long C(int m,int n);
char *next(char ch[],int n);//
void main()
{
int m,n,N;
char ch[100];
printf("请输入A的个数,B的个数\n");
scanf("%d %d",&m,&n);
N=C(m+n,n);
printf("共有%d种排列\n",N);
for(int i=0;i<m;i++)
ch[i]='A';
for(int i=m;i<m+n;i++)
ch[i]='B';
ch[m+n]='\0';
for(int i=0;i<N;i++)
{
printf("%s ",ch);
next(ch,m+n);
}
sytem("pause");
}
long C(int m,int n)
{
long x=1;
n= m-n< n ? m-n:n;
for(int i=1;i<=n;i++)
{
x=x*m--/i;
}
return x;
}
char *next(char ch[],int char_size)
{
int i,count=0;
for(i=char_size-1;i>0;i--)
{
if(ch[i]=='B'&&ch[i-1]=='A')break;
if(ch[i]=='B')count++;
}
ch[i]='A';
ch[i-1]='B';
for(++i;i<char_size;i++) ch[i]='A';
for(i=char_size-1;count-->0;i--) ch[i]='B';
return ch;
}
共有m+n个位置,从m+n个位置中选出n个位置,放B就可以了.
经过排序后得到:
AABB ABAB ABBA BAAB BABA BBAA
定义一个函数fun(char ch[]);
fun("AABB")等于"ABAB",
fun("ABAB")等于"ABBA",
……
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long C(int m,int n);
char *next(char ch[],int n);//
void main()
{
int m,n,N;
char ch[100];
printf("请输入A的个数,B的个数\n");
scanf("%d %d",&m,&n);
N=C(m+n,n);
printf("共有%d种排列\n",N);
for(int i=0;i<m;i++)
ch[i]='A';
for(int i=m;i<m+n;i++)
ch[i]='B';
ch[m+n]='\0';
for(int i=0;i<N;i++)
{
printf("%s ",ch);
next(ch,m+n);
}
sytem("pause");
}
long C(int m,int n)
{
long x=1;
n= m-n< n ? m-n:n;
for(int i=1;i<=n;i++)
{
x=x*m--/i;
}
return x;
}
char *next(char ch[],int char_size)
{
int i,count=0;
for(i=char_size-1;i>0;i--)
{
if(ch[i]=='B'&&ch[i-1]=='A')break;
if(ch[i]=='B')count++;
}
ch[i]='A';
ch[i-1]='B';
for(++i;i<char_size;i++) ch[i]='A';
for(i=char_size-1;count-->0;i--) ch[i]='B';
return ch;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询