#include <stdio.h>
#include <stdlib.h>
/*集合元素的输入*/
long long change_string(char *ch){
//将元素变成01存进大整型中,1为有,0为无,A在最高位,Z在最低位
unsigned long a = 0; //无符号大整型最多为32位,大写字母只有26个,足够存放
int i,j;
for(j='A';j<='Z';j++)
{//双循环按从A到Z的顺序查找字符串中是否存在对应元素
for(i=0;i<50;i++)
{
if(ch[i]==j)
{//若查找存在,a+1并用break退出最近一次循环,进入下一个大写字母的查找
//a+1即对应的二进制末尾的0变1,就十进制而言表示为+1
a = a+1;
break;
}
}
a <<= 1; //一次大写字母存在性录入完毕,a右移一位,此时末尾为0
}
a >>= 1; //由于a右移的实现写在两次循环之间,即最后一次查找完毕后a仍然多右移了一位,因此此处左移一位
return a;
}
/*集合的显示*/
void print(long long a)
{
int j=90; //j用ASCII码标记数字对应的大写字母,A~Z 65~90
while(a) //a不为0,循环继续
{
if(a&1) printf("%c ",j); //取末位倒序打印,若为1打印对应元素
j--;
a >>= 1; //每循环一次j减一,a右移一位
}
printf("\n");
}
/*求集合补集*/
long long Complementary_Set(char *ch)
{
int i,q=1;
for(i=0;i<25;i++)
{//生成全集为11111111111111111111111111
q <<= 1;
q += 1;
}
long long a=change_string(ch);
return a^q; //返回异或的结果
}
/*求集合交集*/
long long Intersection_Set(char *a,char *b)
{
return change_string(a)&change_string(b);
}
/*求集合并集*/
long long Union_Set(char *a,char *b)
{
return change_string(a)|change_string(b);
}
int main()
{
long long tem;
char ch1[50]={"ACBRANQZBT"}; //ABCNQRTZ
char ch2[50]={"AEFOQWQOQA"}; //AEFOQW
printf("basic set1 is:"); //补集
print(change_string(ch1));
printf("basic set2 is:"); //补集
print(change_string(ch2));
printf("complementary set is:"); //补集
print(Complementary_Set(ch1));
printf("intersection set is:");
print(Intersection_Set(ch1,ch2));
printf("union set is:");
print(Union_Set(ch1,ch2));
}
c语言实现:
题目:集合的交、并、补运算
全集为大写字母 ‘A’~‘Z’,要求使用位运算实现。
要求实现以下功能:
1、集合的输入:自动去掉重复和其他字符;
2、集合的显示:输出集合的全部元素(顺序任意);
3、输出一个给定集合的补集;
4、输出两个给定集合的交集和并集。
代码参考了很多大佬的做法。