离散数学2集合论文档格式.docx
- 文档编号:17278362
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:11
- 大小:33.93KB
离散数学2集合论文档格式.docx
《离散数学2集合论文档格式.docx》由会员分享,可在线阅读,更多相关《离散数学2集合论文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
A∪B={x|x∈A∨x∈B}
A-B={x|x∈A∧xB}
P(A)={Ai|i∈J},其中J={i|i是二进制数且
≤i≤
}。
按照
(2)求出子集并判断是否符合要求。
设S={1,2,3,…,n},(a1,a2,…,an)和(b1,b2,…,bn)是S的两个全排列,若存在i∈{1,2,…,n},使得对一切j=1,2,…,i有aj=bj且ai+1<
bi+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)的下一个排列。
求一个排列(a1,a2,…,an)的下一个排列的算法如下:
(1)求满足关系式aj-1<
aj的j的最大值,设为i,即i=max{j|aj-1<
aj}
(2)求满足关系式ai-1<
ak的k的最大值,设为j,即j=max{k|ai-1<
ak}
(3)ai-1与aj互换得序列(b1,b2,…,bn)
(4)将(b1,b2,…,bn)中部分bi,bi+1,…,bn的顺序逆转,得到(b1,b2,…,bi-1,bn,…,bi)便是所求得下一个排列。
四、实验原始纪录(源程序、数据结构等)
#include<
stdio.h>
stdlib.h>
string.h>
math.h>
voidSet_To_Array(char*Set,char*Array)//集合转化为一维字符数组
{
inti,j;
j=0;
for(i=1;
i<
(int)strlen(Set)-1;
i=i+2)Array[j++]=Set[i];
Array[j]='
\0'
;
}
voidArray_To_Set(char*Array,char*Set)//一维字符数组转化为集合
Set[j++]='
{'
for(i=0;
Array[i]!
='
i++){Set[j++]=Array[i];
Set[j++]='
'
if(j>
1){Set[j-1]='
}'
Set[j]='
else{Set[j++]='
}
voidGet_ISet()//集合的交运算
inti,j,k;
char*A,*B,*C,*S1,*S2,*S;
A=newchar;
B=newchar;
C=newchar;
S1=newchar;
S2=newchar;
S=newchar;
printf("
请输入集合A="
);
scanf("
%s"
S1);
Set_To_Array(S1,A);
请输入集合B="
S2);
Set_To_Array(S2,B);
if(!
strlen(A)||!
strlen(B))printf("
A∩B={}\n"
else
k=0;
A[i]!
i++)
for(j=0;
B[j]!
j++)
if(A[i]==B[j]){S[k++]=A[i];
break;
S[k]='
Array_To_Set(S,C);
A∩B=%s\n"
C);
voidGet_USet()//集合的并运算
inti,j,k,flag;
S2=newchar;
S=newchar;
S=A;
k=strlen(S);
B[i]!
flag=1;
for(j=0;
A[j]!
if(A[j]==B[i]){flag=0;
if(flag)S[k++]=B[i];
A∪B=%s\n"
voidGet_DSet()//集合的差运算
S2=newchar;
S=newchar;
flag=1;
if(A[i]==B[j]){flag=0;
if(flag)S[k++]=A[i];
A-B=%s\n"
voidGet_PSet()//求集合的幂集
inti,j,k,n;
char*A,*P,*S1,*S;
P=newchar;
n=strlen(A);
P(A)={"
(int)pow(2,n);
j<
n;
if(i&
(int)pow(2,j))S[k++]=A[j];
S[k]='
Array_To_Set(S,P);
if(strlen(S)==strlen(A))printf("
P);
elseprintf("
%s,"
}\n"
intf(intn,intm)
ints=1,i;
for(i=n-m+1;
=n;
i++)s=s*i;
returns;
voidGet_SubSet()//求集合指定元素个数的子集
inti,j,m,k,ip,g;
char*A,*S1,*S,*B;
A=newchar;
S1=newchar;
printf("
A="
g="
%d"
&
g);
m=strlen(A);
if(g<
1||g>
m){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)){S[k++]=A[j];
ip++;
if(ip==g){Array_To_Set(S,B);
%s\n"
B);
}
voidswap(int&
a,int&
b)
a=a+b;
b=a-b;
a=a-b;
voidswapc(char*A,inti,intj)
chartemp;
temp=A[i];
A[i]=A[j];
A[j]=temp;
voidGet_SArrange()
inti,j,k,m,n,p,*C;
char*A,*S;
C=newint;
S);
Set_To_Array(S,A);
for(k=1;
k<
k++)C[k]=k;
全排列如下:
A);
p=1;
k++)p=p*C[k];
for(m=1;
m<
p;
m++)
for(j=2;
j++)if(C[j-1]<
=C[j])i=j;
for(k=i;
k++)if(C[i-1]<
C[k])j=k;
swap(C[i-1],C[j]);
swapc(A,i-2,j-1);
for(k=0;
k++)
if(i+k<
n-k)
swap(C[i+k],C[n-k]);
swapc(A,i+k-1,n-k-1);
-->
voidmain()
inti=1;
while(i>
0)
System(“cls”);
1、求两个集合的交集2、求两个集合的并集\n"
3、求两个集合的差集4、求一个集合的幂集\n"
5、求一个集合的m元子集6、求任意集合元素的全排列\n"
0、退出\n"
请选择要进行的操作:
"
scanf("
i);
switch(i){
case1:
Get_ISet();
case2:
Get_USet();
case3:
Get_DSet();
case4:
Get_PSet();
case5:
Get_SubSet();
case6:
Get_SArrange();
case0:
exit(-2);
default:
选择错误,请重新选择:
\n\n"
五、实验结果及分析(计算过程与结果、数据曲线、图表等)
求任意两个集合的交集、并集、差集。
求任意一个集合的幂集。
求任意一个集合的所有m元子集。
求任意个元素的全排列。
集合的表示采用列举法,如A={a,b,c,d}
六、实验总结与思考
此实验课程,能有效地锻炼我们的逻辑思维能力,使我们更系统,逻辑思考能力得到锻炼,分析例子更为简单,所以,此次实验,使我了解集合论的各种基础,受益匪浅。
教师评语:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 离散数学 集合论