2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > c语言集合交并补 位运算实现

c语言集合交并补 位运算实现

时间:2019-12-29 21:07:50

相关推荐

c语言集合交并补 位运算实现

#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、输出两个给定集合的交集和并集。

代码参考了很多大佬的做法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。