1、ABx|xAxBABx|xAx BP(A)Ai|iJ,其中Ji|i是二进制数且i。按照(2)求出子集并判断是否符合要求。设S=1,2,3,n,(a1,a2,an)和(b1,b2,bn)是S的两个全排列,若存在i1,2,n,使得对一切j=1,2,i有aj=bj且ai+1bi+1,则称排列(a1,a2,an)字典序的小于(b1,b2,bn)。记为(a1,a2,an)(b1,b2,bn)。若(a1,a2,an)(b1,b2,bn),且不存在(c1,c2,cn)使得(a1,a2,an) (c1,c2,cn)(b1,b2,bn),则称(b1,b2,bn)为(a1,a2,an)的下一个排列。求一个排列(a
2、1,a2,an)的下一个排列的算法如下:(1)求满足关系式aj-1aj的j的最大值,设为i,即i=maxj|aj-1aj(2)求满足关系式ai-1ak的k的最大值,设为j,即j=maxk|ai-1ak(3)ai-1与aj互换得序列(b1,b2,bn)(4)将(b1,b2,bn)中部分bi,bi+1,bn的顺序逆转,得到(b1,b2,bi-1,bn,bi)便是所求得下一个排列。四、实验原始纪录(源程序、数据结构等)#includestdlib.hstring.hmath.hvoid Set_To_Array(char *Set,char *Array)/集合转化为一维字符数组int i,j;j=
3、0;for(i=1;i1)Setj-1=Setj=else Setj+= void Get_ISet()/集合的交运算int i,j,k;char *A,*B,*C,*S1,*S2,*S;A=new char; B=new char; C=new char;S1=new char; S2=new char; S=new char;printf(请输入集合A=);scanf(%s,S1); Set_To_Array(S1,A);请输入集合B=,S2);Set_To_Array(S2,B);if(!strlen(A)|!strlen(B)printf(AB=nelsek=0;Ai!i+)for(j
4、=0;Bj!j+)if(Ai=Bj)Sk+=Ai;break;Sk=Array_To_Set(S,C);AB=%sn,C);void Get_USet()/集合的并运算int i,j,k,flag;S2=new char;S=new char; S=A;k=strlen(S);Bi! flag=1; for(j=0;Aj! if(Aj=Bi)flag=0; if(flag)Sk+=Bi;AB=%snvoid Get_DSet()/集合的差运算 S2=new char; S=new char; flag=1;if(Ai=Bj)flag=0; if(flag)Sk+=Ai;A-B=%snvoid
5、Get_PSet()/求集合的幂集int i,j,k,n;char *A,*P,*S1,*S;P=new char;n=strlen(A);P(A)=(int)pow(2,n);jn;if(i&(int)pow(2,j)Sk+=Aj; Sk= Array_To_Set(S,P);if(strlen(S)=strlen(A)printf(,P);else printf(%s,nint f(int n,int m)int s=1,i;for(i=n-m+1;=n;i+)s=s*i;return s;void Get_SubSet()/求集合指定元素个数的子集 int i,j,m,k,ip,g; c
6、har *A,*S1,*S,*B; A=new char; S1=new char; printf(A=g=%d,&g); m=strlen(A); if(gm)printf(输入的元数错误return;集合A=%s的%d元子集如下:n,S1,g); for(i=1;=f(m,g); k=0;ip=0;m; if(i&(int)pow(2,j)Sk+=Aj;ip+; if(ip=g)Array_To_Set(S,B);%sn,B); void swap(int &a, int &b) a=a+b; b=a-b; a=a-b;void swapc(char *A,int i,int j) cha
7、r temp; temp=Ai; Ai=Aj; Aj=temp;void Get_SArrange()int i,j,k,m,n,p,*C;char *A,*S;C=new int;,S); Set_To_Array(S,A);for(k=1;kk+)Ck=k; 全排列如下:,A);p=1;k+)p=p*Ck;for(m=1;mp;m+)for(j=2;j+)if(Cj-1=Cj)i=j;for(k=i;k+)if(Ci-1Ck)j=k;swap(Ci-1,Cj);swapc(A,i-2,j-1);for(k=0;k+)if(i+kvoid main() int i=1; while(i0)
8、System(“cls”);1、求两个集合的交集 2、求两个集合的并集n3、求两个集合的差集 4、求一个集合的幂集n5、求一个集合的m元子集 6、求任意集合元素的全排列n0、退出n请选择要进行的操作: scanf(i); switch(i) case 1:Get_ISet(); case 2:Get_USet(); case 3:Get_DSet(); case 4:Get_PSet(); case 5:Get_SubSet(); case 6:Get_SArrange(); case 0:exit(-2); default:选择错误,请重新选择:nn五、实验结果及分析(计算过程与结果、数据曲线、图表等)求任意两个集合的交集、并集、差集。求任意一个集合的幂集。求任意一个集合的所有m元子集。求任意个元素的全排列。集合的表示采用列举法,如A=a,b,c,d六、实验总结与思考此实验课程,能有效地锻炼我们的逻辑思维能力,使我们更系统,逻辑思考能力得到锻炼,分析例子更为简单,所以,此次实验,使我了解集合论的各种基础,受益匪浅。教师评语: