#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,就十进制而言表示为+1a = 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~90while(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++){//生成全集为11111111111111111111111111q <<= 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"}; //ABCNQRTZchar ch2[50]={"AEFOQWQOQA"}; //AEFOQWprintf("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、输出两个给定集合的交集和并集。
代码参考了很多大佬的做法。