练习题 - 集合的运算(数理逻辑)

前言

算法拾遗继续。

题目

问题描述

在计算机科学应用中,我们经常要用到集合的运算,集合的运算操作有很多,下面是我们给出的集合基本运算定义: (1)“∪”运算:设S,T是2个集合,那么S∪T是由S和T的元素组成的集合。 (2)“-”运算:设S,T是2个集合,那么S-T是由S中非T中的元素组成的集合。 (3)“∩”运算:设S,T是2个集合,那么S∩T是由既是S又是T的元素组成的集合。“⊕” 运算:设S,T是2个集合,那么S⊕T是由S中不是T中的元素和T中不是S中的元素组成的集合。 例如,S={1,2,3,4},T={3,4,5,6},那么: S∪T={1,2,3,4,5,6} S-T={1,2} S∩T={3,4} S⊕T={1,2,5,6} 你的任务就是:对于输入文件中给出的正整数集合S、T,编程求出S∪T,S-T,S∩T和S⊕T。

输入(set.in)

第1行,为集合S的各元素;第2行,为集合T的各元素;每行数据之间用空格分开,集合元素的个数≤10000,各正整数在1到30000之间。

输出(set.out)

第1行为集合S∪T;第2行为集合S-T;第3行为集合S∩T;第4行为集合S⊕T。
要求:集合的元素按由小到大顺序输出,正整数之间用空格分开;如果是空集,则输出-1。

样例 Set.in

9 3 7 6 5
10 5 4 3 2 7

set.out

2 3 4 5 6 7 9 10
6 9
3 5 7
2 4 6 9 10

解答

简单数理逻辑,主要为对数组的编程操作,具体代码如下。

#include <stdio.h>
#include <string.h>

FILE *in, *out;
int an, bn, a[10001] = {0}, b[10001] = {0}, d, z = 0;
char c;

void swap(int x[], int i, int j) {
  int tem;
  tem = x[i];
  x[i] = x[j];
  x[j] = tem;
}

void paixu(int x[], int len) {
  int i, j;
  for (i = 0; i < len - 1; i++)
    for (j = i; j < len; j++)
      if (x[i] > x[j])
        swap(x, i, j);
}

void bingji(int x[], int y[]) {
  int i = 0, j = 0;
  while (i < an && j < bn) {
    if (x[i] < y[j])
      fprintf(out, "%d ", x[i++]);
    else if (x[i] == y[j]) {
      fprintf(out, "%d ", x[i++], j++);
    } else
      fprintf(out, "%d ", y[j++]);
  }
  while (i < an)
    fprintf(out, "%d ", x[i++]);
  while (j < bn)
    fprintf(out, "%d ", y[j++]);
  fprintf(out, "\n");
}

void chaji(int x[], int y[]) {
  int i = 0, j = 0;
  while (i < an && j < bn) {
    if (x[i] < y[j])
      fprintf(out, "%d ", x[i++]);
    else if (x[i] == y[j]) {
      i++;
      j++;
    } else
      j++;
  }
  while (i < an)
    fprintf(out, "%d ", x[i++]);
  fprintf(out, "\n");
}

void jiaoji(int x[], int y[]) {
  int i = 0, j = 0;
  while (i < an && j < bn) {
    if (x[i] == y[j])
      fprintf(out, "%d ", x[i++], j++);
    else if (x[i] < y[j])
      i++;
    else
      j++;
  }
  fprintf(out, "\n");
}

void heji(int x[], int y[]) {
  int i = 0, j = 0;
  while (i < an && j < bn) {
    if (x[i] < y[j])
      fprintf(out, "%d ", x[i++]);
    else if (x[i] == y[j]) {
      i++;
      j++;
    } else
      fprintf(out, "%d ", y[j++]);
  }
  while (i < an)
    fprintf(out, "%d ", x[i++]);
  while (j < bn)
    fprintf(out, "%d ", y[j++]);
  fprintf(out, "\n");
}

int main() {
  in = fopen("set.in", "r");
  out = fopen("set.out", "w");
  z = 0;
  while (1) {
    fscanf(in, "%d%c", &d, &c);
    if (c != 10)
      a[z++] = d;
    else {
      a[z++] = d;
      break;
    }
  }
  an = z;
  z = 0;
  while (1) {
    fscanf(in, "%d%c", &d, &c);
    if (c != 10)
      b[z++] = d;
    else {
      b[z++] = d;
      break;
    }
  }
  bn = z;

  paixu(a, an);
  paixu(b, bn);

  /*
  int i;
  for(i=0;i<an;i++)
    printf("%d ",a[i]);
  printf("\n");
  for(i=0;i<bn;i++)
    printf("%d ",b[i]);
  getchar();*/

  bingji(a, b);
  chaji(a, b);
  jiaoji(a, b);
  heji(a, b);
  fprintf(out, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");

  return 0;
}

* cached version, generated at 2018-12-02 13:57:20 UTC.

Subscribe by RSS