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,就十进制而言表示为+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、输出两个给定集合的交集和并集。 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值