| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1315 人关注过本帖
标题:问题:比较集合的大小
只看楼主 加入收藏
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
 问题点数:0 回复次数:4 
问题:比较集合的大小
给定两个集合 A、B,集合内的任一元素 x满足 1 ≤ x ≤ 109,并且每个集合的元素个数不大
于 105。我们希望求出 A、B之间的关系。
任 务 :给定两个集合的描述,判断它们满足下列关系的哪一种:
A是 B的一个真子集,输出 “A is a proper subset of B”
B是 A的一个真子集,输出 “B is a proper subset of A”
A和 B是同一个集合,输出 “A equals B”
A和 B的交集为空,输出 “A and B are disjoint”
上述情况都不是,输出“I'm confused!”


Input

输入有两行,分别表示两个集合,每行的第一个整数为这个集合的元素个数(至少一个),
然后紧跟着这个集合的元素(均为不同的正整数)

Output

输出只有一行,就是 A、B的关系。

Sample Input

2 55 27
2 55 27

3 9 24 19
2 9 24

3 1 2 3
4 1 2 3 4

3 1 2 3
3 4 5 6

2 1 2
2 2 3

Sample Output

A equals B
B is a proper subset of A
A is a proper subset of B
A and B are disjoint
I'm confused!问题

[[it] 本帖最后由 心剑菩提 于 2008-3-7 16:58 编辑 [/it]]
搜索更多相关主题的帖子: 子集 subset proper 输出 元素 
2008-03-06 14:39
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
程序代码:
#include <stdio.h>

struct Set{
   long long bits[2];
   void clear(){
       bits[0]=bits[1]=0;
   }
   void insert(int n){
          if(n<64){
                 bits[0]|=(1ll<<n);
          }
          else {
                 bits[1]|=(1ll<<(n-64));
          }
   }
}SetA,SetB;

bool operator == (const Set& A,const Set& B)
{
    return A.bits[0]==B.bits[0] && A.bits[1]==B.bits[1];
}

int contain(const Set& A,const Set& B)
{
    return (B.bits[0]&~A.bits[0])==0 && (B.bits[1]&~A.bits[1])==0;
}

int intersectant(const Set& A,const Set& B)
{
    return !((B.bits[0]&A.bits[0])==0 && (B.bits[1]&A.bits[1])==0);
}


int main()
{
    int n,m,t;
    while(scanf("%d",&n)!=EOF){
        SetA.clear();
        SetB.clear();
        for(int i=0;i<n;i++){
            scanf("%d",&t);
            SetA.insert(t);
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++){
            scanf("%d",&t);
            SetB.insert(t);
        }
        if(SetA==SetB){
            printf("A equals B\n");
        }
        else if(contain(SetA,SetB)){
            printf("B is a proper subset of A\n");
        }
        else if(contain(SetB,SetA)){
            printf("A is a proper subset of B\n");
        }
        else if(!intersectant(SetA,SetB)){
            printf("A and B are disjoint\n");
        }
        else {
            printf("I'm confused!\n");
        }
    }
}
2008-03-06 15:25
jacques
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-3-6
收藏
得分:0 
我想用顺序表的数据结构来实现:
comparefun(SqList *L1,SqList *L2)
if(L1->length==0 &&L2->length==0)
  printf("空集");
else if(L1->length==L2->length)
{
    for(i=0;i<L1->length;i++)
      {
          GetElem(L1,i,e);
          for(j=0;j<L2->length;j++)
             if(Locate(L2,e,equal)
                 printf("A B 相等");
       }
}
else if(L1->length<L2->length)
{
   for(i=0;i<L1->length;i++)
      {
          GetElem(L1,i,e);
          for(j=0;j<L2->length;j++)
             if(Locate(L2,e,equal)
                 printf("A 是B的真子集 ");
       }
}
else if()
   for(i=0;i<L1->length;i++)
      {
          GetElem(L1,i,e);
          for(j=0;j<L2->length;j++)
             if(!Locate(L2,e,equal)
                 printf("A 与B的交集是空集 ");

else
2008-03-06 17:41
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
得分:0 
#include <stdio.h>
int main()
{
   int i,j,k,m,n,a[150],b[150];
   while(scanf("%d",&m)!=EOF)
   {
     for(i=0;i<m;i++)  scanf("%d",&a[i]);
     scanf("%d",&n);
     for(i=0;i<n;i++)  scanf("%d",&b[i]);
     k=0;
     if(m<n)
     { for(i=0;i<m;i++)
           for(j=0;j<n;j++)
           {    if(a[i]==b[j]){k++;break;}    }
       if(k==m)
           printf("A is a proper subset of B\n");
       else if(k==0)
           printf("A and B are disjoint\n");
       else
           printf("I'm confused!\n");
    }
    if(m==n)
    {  for(i=0;i<m;i++)
           for(j=0;j<n;j++)
           {    if(a[i]==b[j]){k++;break;}    }
       if(k==m)
               printf("A equals B\n");
       else if(k==0)
               printf("A and B are disjoint\n");
       else
               printf("I'm confused!\n");
    }
    if(m>n)
    {  for(i=0;i<n;i++)
           for(j=0;j<m;j++)
           {    if(b[i]==a[j]){k++;break;}    }
       if(k==n)
           printf("B is a proper subset of A\n");
       else if(k==0)
           printf("A and B are disjoint\n");
       else
           printf("I'm confused!\n");
    }
   }
   return 0;
}

前世五百次的回眸 才换来今生的擦肩而过
2008-03-10 22:48
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
得分:0 
#include <stdio.h>
int main()
{
   int i,j,k,m,n,a[150],b[150];
   while(scanf("%d",&m)!=EOF)
   {
     for(i=0;i<m;i++)  scanf("%d",&a[i]);
     scanf("%d",&n);
     for(i=0;i<n;i++)  scanf("%d",&b[i]);
     k=0;
     if(m<n)
     { for(i=0;i<m;i++)
           for(j=0;j<n;j++)
           {    if(a[i]==b[j]){k++;break;}    }
       if(k==m)
           printf("A is a proper subset of B\n");
       else if(k==0)
           printf("A and B are disjoint\n");
       else
           printf("I'm confused!\n");
    }
    if(m==n)
    {  for(i=0;i<m;i++)
           for(j=0;j<n;j++)
           {    if(a[i]==b[j]){k++;break;}    }
       if(k==m)
               printf("A equals B\n");
       else if(k==0)
               printf("A and B are disjoint\n");
       else
               printf("I'm confused!\n");
    }
    if(m>n)
    {  for(i=0;i<n;i++)
           for(j=0;j<m;j++)
           {    if(b[i]==a[j]){k++;break;}    }
       if(k==n)
           printf("B is a proper subset of A\n");
       else if(k==0)
           printf("A and B are disjoint\n");
       else
           printf("I'm confused!\n");
    }
   }
   return 0;
}

前世五百次的回眸 才换来今生的擦肩而过
2008-03-10 22:48
快速回复:问题:比较集合的大小
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035847 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved