任务描述
相关知识
编程要求
测试说明
任务描述
本关任务
编写一个程序,实现集合的并、交、差运算
1)输入集合 A 和 B,求 A 与 B 的并集 Union(Union=A∪B)。
2)输入集合 A 和 B,求 A 与 B 的交集 Intersection(IN=A∩B)。
3)输入集合 A 和 B,求 A 与 B 的差集 Sub(Sub=A-B)。
(集合在程序中可以用一维数组表示。本关默认集合元素为整数类型)
相关知识
1、集合运算-并、交、差运算
1)并集
因为并集的定义为:Union={x|x∈A∨x∈B},所以,只要将集合 A 与 B 合在一起就得到了并集Union。但是,在一个集合中,同样的元素没必要出现两次或两次以上,所以,在将集合 A 送入并集 Union 后,应将集合 B 中与 A 中相同的元素删除,再将集合 B 送入并集Union之中。
算法描述如下:
集合 B 的元素个数送 m,集合 A 的元素个数送n。
Union初始化为A。
i=1。
若 i> m,则结束。
否则,对于 j=1,2,……,n,判断:B[i]==A[j],若相等,则转(7)。
否则,B[i]放入Union中。
i=i+1,转(4)。
2)交集
根据交集的定义:IN={x|x∈A∧x∈B},我们将集合 A 的各个元素与集合 B的元素进行比较,若在集合 B 中存在某个元素和集合 A 中一元素相等,则将该元素送入交集 IN之中。
算法描述如下:
将集合 A 的元素个数送 n。
i=1
若 i>n,则结束。
否则,将A[i]与集合B中的每个元素进行比较,若A[i]与集合B中所有元素均不相同,则转(6)。
否则,A[i]放入IN中。
i=i+1,转(3)。
3)差集
差集 Sub的定义:差集 Sub={x|x∈A∧x∉B},即对于集合 A 中的元素 A[i],若不存在B[j] ∈B(j=1,2,…,m),使得 A[i]==B[j],则 A[i] ∈差集Sub。
算法描述如下:
将集合 A 的元素个数送n。
i=1。
i>n,则结束。
否则,将 A[i]与集合 B 中的每个元素相比较,若 A[i] 与集合 B 中的某个元素相同,则转(6)。
否则,A[i]放入Sub中。
i=i+1,转(3)。
编程要求
根据提示,在右侧编辑器补充代码,计算并输出两个集合的并集、交集、差集。
输入要求:依次输入集合A的元素个数、集合A的所有元素、集合B的元素个数、集合B的所有元素;
输出要求:顺序输出并集Union,交集Intersection,差集Sub。
输出示例:
//输出结果
printf("Union={"); //并集
for(i=0;i<u_num;i++)
{
printf("%d ",Union[i]);
}
printf("}\n");
printf("Intersection={");//交集
for(i=0;i<i_num;i++)
{
printf("%d ",IN[i]);
}
printf("}\n");
printf("Sub={"); //差集
for(i=0;i<s_num;i++)
{
printf("%d ",Sub[i]);
}
printf("}\n");
测试说明
平台会对你编写的代码进行测试:
测试输入:3 1 2 3
4 3 4 5 6
预期输出:
Union={1 2 3 4 5 6 }
Intersection={3 }
Sub={1 2 }
开始你的任务吧,祝你成功!
/*
* 2-1.c
*
*输入集合A、B,求A∪B,A∩B,A-B
*
* 在begin和end之间补全代码
*/
#include <stdio.h>
#include <stdlib.h>
int find(int *a,int n,int b)//查找数组a[n]中是否有元素b,若有则返回1,否则返回0
{
/**********begin****************/
for(int i=0;i<n;i++)
{
if(a[i]==b)
return 1;
}
return 0;
/**********end****************/
}
int main(int argc, char **argv)
{
int *A;
int *B;
int *Union,*IN,*Sub; //定义并集、交集、差集
int u_num=0,i_num=0,s_num=0; //并集、交集、差集的元素个数
int n,m,i;
//printf("集合A的元素个数:");
scanf("%d",&n);
//printf("数组A的所有元素:\n");
A=malloc(n*sizeof(int)); //分配内存
for(i=0;i<n;i++) //输入A[n]
{
scanf("%d",A+i);
}
//printf("集合B的元素个数");
scanf("%d",&m);
//printf("集合B的所有元素\n");
B=malloc(m*sizeof(int)); //分配内存
for(i=0;i<m;i++) //输入B[m]
{
scanf("%d",B+i);
}
Union=malloc((m+n)*sizeof(int));
IN=malloc(n*sizeof(int));
Sub=malloc(n*sizeof(int));
//补充代码,求并集、交集、差集
/**********begin****************/
//并集
int j=0;
i=0;
while(i<n)
{
while(j<m)
{
if(A[i]<B[j])
{
Union[u_num]=A[i];
u_num++;
i++;
}
if(A[i]>B[j])
{
Union[u_num]=B[j];
u_num++;
j++;
}
if(A[i]==B[j])
{
Union[u_num]=A[i];
i++;
j++;
u_num++;
}
if(i>=n||j>=m)
break;
}
if(i>=n||j>=m)
break;
}
while(i<n)
{
Union[u_num]=A[i];
i++;
u_num++;
}
while(j<m)
{
Union[u_num]=B[j];
j++;
u_num++;
}
//交集
i=0;
j=0;
while(i<n)
{ j=0;
while(j<m)
{
if(A[i]==B[j])
{
IN[i_num]=A[i];
i_num++;
j++;
break;
}
else
j++;
}
i++;
}
//差集
i=0;
j=0;
int flag=0;
while(i<n)
{ j=0;
while(j<m)
{
if(A[i]==B[j])
{
flag=1;
break;
}
j++;
}
if(flag==0)
{
Sub[s_num]=A[i];
s_num++;
}
i++;
}
/**********end****************/
//输出结果
printf("Union={");
for(i=0;i<u_num;i++)
{
printf("%d ",Union[i]);
}
printf("}\n");
printf("Intersection={");
for(i=0;i<i_num;i++)
{
printf("%d ",IN[i]);
}
printf("}\n");
printf("Sub={");
for(i=0;i<s_num;i++)
{
printf("%d ",Sub[i]);
}
printf("}\n");
free(A);
free(B);
free(Union);
free(IN);
free(Sub);
return 0;
}