C语言编程 集合子集问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言编程 集合子集问题相关的知识,希望对你有一定的参考价值。

本训练中的每类问题都是系列问题,每个问题必须用至少一个子函数来实现

集合运算问题
设集合A=al , a2, a3… ,am ,集合B=bl , b2,… ,bn,则求下列运算
l)判断a∈A

2)判断集合B是否为集合A的子集
说明一下,1,,2 ,,,条件是两个不同的程序--。

#include<iostream> 
#include<string>
#include<fstream>
#include<conio.h>
using namespace std;
//定义集合的最大数量,可以自己修改
#define MAX_COUNT 100    
//集合使用数组来保存
int SetA[MAX_COUNT];
int SetB[MAX_COUNT];
int CountA = 0;   //集合A的长度
int CountB = 0;   //集合B的长度
///函数Contains,判定集合是否包含一个数
///@param set, 集合
///@param count, 集合Set中的元素个数
///@param value, 是否包含的值
///@return set包含value,返回true,否则返回false
bool Contains(int set[], int count, int value)

 for(int i = 0; i < count; i++)
  if(value == set[i])
   return true;
 return false;

//输入一个集合
void InputSet(int set[], int &count)

 string s;
 //读取这一行
 getline(cin, s);
 int i = 0;
 while(i < s.length() )
 
  int spacePos = 0;
  spacePos = s.find(' ', i);      //查找空格下一个空格的位置
  if(spacePos < 0 || spacePos >= s.length() - 1)    //如果没有空格或者空格超出了字符串范围,跳出循环
   break;
  string temp = s.substr(i, spacePos - i);        
  if(temp == "")                                  //如果字符串为空,执行下一条
   continue; 
  int value = stoi(temp);
  if(!Contains(set, count, value))                //如果集合中已经包含此数字了,就不再添加
   set[count++] = value;
  i = spacePos + 1;
 
 //读取最后一个数
 string temp = s.substr(i, s.length() - i);
 int value = stoi(temp);
 if(!Contains(set, count, value))
  set[count++] = value;

//判断是为setB是否为setA的子集
bool IsSubSet(int setA[], int countA, int setB[], int countB)

 for(int i = 0; i < countB; i++)
  if( !Contains(setA, countA, setB[i]))
   return false;
 return true;

void main()

 cout<<"注意:只能输入整数,并且数字之间以空格隔开。"<<endl<<endl;
 cout<< "请输入集合A:" <<endl;
 InputSet(SetA, CountA);
 cout<< "请输入集合B:" <<endl;
 InputSet(SetB, CountB);
 cout<<endl;
 cout<<"集合A和集合B比较结果"<<endl;
 if(IsSubSet( SetA, CountA, SetB, CountB))
  cout<<"集合B是集合A的子集"<<endl;
 else
  cout<<"集合B不是集合A的子集"<<endl;
 cout<<endl;
 cout<<"按任意键退出"<<endl;
 getch();

参考技术A #include <stdio.h>

#define A 5        //数组的大小采用宏定义,方便修改
#define B 3
void Contain (int a[], int num);
void Compare (int a[], int b[]);
int main ()

 int a[A] = 1, 2, 3, 4, 5;   //数组的元素可以自己设置去验证
 int b[B] = 1, 2, 6;
 int flag = 0;
 
 printf("Input a num:");
 scanf("%d", &flag);
 Contain (a, flag);
 Compare (a, b);
 return 0;

/*
a ∈ A ?
*/
void Contain (int a[], int num)

 int i;
 for(i=0; i<A; i++)
 
  if(num == a[i])
  
   printf("%d ∈ A\\n", num);
   break;
  
 
// printf("i = %d\\n", i);
 if(i == 5)
  printf("%d !∈ A\\n", num);
 return;

/*判断集合B是否为集合A的子集 */
void Compare (int a[], int b[])

 int i, j;

 //如果b数组大小比a数组大
 if(sizeof(b)>sizeof(a))
 
  printf("B不是A的子集.\\n");
  return;
 
 for(i=0; i<B; i++)
 
  for(j=0; j<A; j++)
  
   if(b[i] != a[i])
   
    printf("B不是A的子集.\\n");
    return;
   
  
 
 printf("B是A的子集.\\n");

追问

1,2条件是两个不同的程序--。

追答

两个main?拆一下就行了我把文件上传给你吧,你看看这两个文件。

 

 

以上是关于C语言编程 集合子集问题的主要内容,如果未能解决你的问题,请参考以下文章

编程珠玑第二章编程求解组合问题

7.1 深搜-子集和问题 (枚举子集+剪枝)

ACM-Subset sum

C语言 克鲁斯卡尔算法怎么判断是不是构造成回路?求大手解答

JSON 简介

傻瓜方法求集合的全部子集问题(java版)