基于二进制的集合(c语言)

46 篇文章 0 订阅

用C去操作集合,有时候觉得十分的麻烦,不过,集合又一定要用。苦思了一些日子,当集合遇到了二进制,也当二进制到了位运算。这个就很好解决。建立这样的一个模型,当集合A有元素a,就用1在a相应的位表示出来,否则就为0 。

一个例子:A={a,b,c} --------7(111)

               A有一字集A1={a,c}-------------5(101)

就这样表示。

集合与二进制有一个很思意的相同点,n个元素的集合有2^n个子集;n位的二进制有2^n个表示方法,好吧,让他们对应起来吧。

对于集合B={a,b},看下面:

+--------+--------+--------+

|   集合  |  二进制|   整数  |

+--------+--------+--------+

|   空集  |  00     |   0      |

+--------+--------+--------+

|   {a}  |  01     |   1      |

+--------+--------+--------+

|   {b}  |  10     |   2      |

+--------+--------+--------+

| {a,b}  |  11    |   3      |

+--------+--------+--------+

就这样了。对于集合的操作也就是相应的操作了,写一个C代码看得具体一点。

 

#include<stdio.h>
void bin_to_set(unsigned int x , char e[]){
    int i = 0,f = 0 ;
    printf("{") ;
    while(x > 0){
        if((x & 1) == 1) {
            if(f == 0)  {printf("%c",e[i]) ; f = 1 ;}
            else printf(",%c",e[i]) ;
        }
        ++i ;
        x >>= 1 ;
    }
    printf("}") ;
}
unsigned int U(unsigned int x1 ,unsigned int x2){//并
    return ( x1 | x2 ) ;
}

unsigned int C(unsigned int x1 ,unsigned int x2){//交
    return ( x1 & x2 ) ;
}

unsigned int N(unsigned int x,int n){//非
    return (((1<< n) -1) ^ x) ;
}

int E(unsigned int x1 ,unsigned int x2){//x2是否包括x1
    return ( (x1 | x2) == x2 ) ;
}
void hind_set( char *c,int n){
    int m = 1 << n ;
    int i ;
    for(i = 0 ;i < m ; ++i){
        bin_to_set(i,c) ;
        printf("\n") ;
    }
}
int main(){
    char c[] = {'a','b','c'} ;
    printf("{a,b,c}的幂集:\n") ;
    hind_set(c,3) ;
    unsigned  x1 = 5 ;//{a,c}
    unsigned x2 = 3 ;//{a,b}
    unsigned x = 7 ;//{a,b,c}
    printf("{a,c}与{a,b}并:") ;
    bin_to_set(U(x1,x2),c) ;
    printf("\n{a,c}与{a,b}交:") ;
    bin_to_set(C(x1,x2),c) ;
    printf("\n{a,c}的非:") ;
    bin_to_set(N(x1,3),c) ;
    printf("\n{a,c}是{a,b}的子集吗? %d",E(x1,x2)) ;
    printf("\n{a,c}是{a,b,c}的子集吗? %d",E(x1,x)) ;
    return 0 ;
}

 看一看结果:



 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值