第1关:集合基本运算

任务描述
相关知识
编程要求
测试说明
任务描述
本关任务
编写一个程序,实现集合的并、交、差运算
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值