#183【模拟】集合运算

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/85011327

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;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/85011327
今日推荐