Description
在数学上,2个集合A和B之间的运算一般有并集、差集、交集,分别记作A+B、A-B、A*B。本题要求设计一款模拟集合运算的游戏程序,已知所有集合的元素都是小写字母,集合的输入、输出用字符串表示。例如集合A={a b d e},输入输出用字符串"abde"表示。现在输入n个集合运算式,求运算结果。例如,运算式abcd-bckg,那么结果为ad。
Input
第1行一个正整数n,表示有多少运算式, 1<=n<=100。
下面n行,每行一个运算式。运算符号一定是+、-、*之一,运算符号两边各有一个空格隔开。
Output
共n行,对应输入的运算结果。
2 abcd + bcefg abcd * bcefg
-
Sample Input
abcdefg bc
-
Sample Output
HINT
假设有两个集合A、B。
并集:属于A或属于B的元素合并起来,并去重,得到一个新的集合。
交集:既属于A又属于B的集合,也就是两个集合相同的部分。
差集:假设是A-B,是指属于A,且不属于B的部分。
这样就简单了,直接模拟
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define SIZE 510
using namespace std;
string sa, sb;
bool a[SIZE], b[SIZE];
int main(void)
{
int n, i;
char c, op;
scanf("%d", &n);
while (n--)
{
memset(a, false, sizeof (a)); // 每次都清空
memset(b, false, sizeof (b));
cin >> sa >> op >> sb;
for (i = 0; i < sa.size(); ++i) // 集合A有的元素
{
a[sa[i]] = true;
}
for (i = 0; i < sb.size(); ++i) // 集合B有的元素
{
b[sb[i]] = true;
}
if (op == '+') // 并集
{
for (i = 'a'; i <= 'z'; ++i)
{
if ((a[i]) || (b[i])) // A集合或B集合有
{
printf("%c", i);
}
}
}
else if (op == '-') // 差集
{
for (i = 'a'; i <= 'z'; ++i)
{
if ((a[i]) && (!b[i])) // A集合有但是B集合没有
{
printf("%c", i);
}
}
}
else // 交集
{
for (i = 'a'; i <= 'z'; ++i)
{
if ((a[i]) && (b[i])) // A集合和B集合都有的
{
printf("%c", i);
}
}
}
printf("\n");
}
return 0;
}