编写一个程序,列出{1,2,3....n}这个集合的所有子集,包括空集合。n为有限个。

编写一个程序,列出{1,2,3....n}这个集合的所有子集,包括空集合。n为有限个。,第1张

以下是以freepascal编写的,以字符串的方式表示输入与输出,以递归方法实现,已经过上机验证,如果改写成别的语言应该不难。供参考。

program main;

var

s:string;

n:integer;

procedure subset(s,temp:string;n:integer);

var

i:integer;

begin

if n>=0 then

begin

writeln('{',temp,'}');

for i:=n downto 1 do

subset(s,s[i]+temp,i-1);

end;

end;

begin

writeln;

s:='abcd'; {这是原始集合,以字符串表示}

n:=length(s);

subset(s,'',n);

end

这个程序必然要使用递归来做。当然不用递归的话,编程复杂度高。另外不要认为递归降低效率,呵呵

比如你求一个数组char a[10]的所有子集,那么,你应该需要两个函数参数。

一个是数组指针,一个是数组元素个数。

并且对数组的元素个数进行判断,如果个数n == 1则递归条件终止

如果n > 1,那么就新建一个数组,并做一次扫描,依次剔除原数组中的一个元素,生成其子集,并进行递归

伪代码如下

void Function(char a , int n)

{

char b;

int j ,k ;

if(n > 1)

for ( int i = 0 ; i < n ; i++ )

{

b = new char[n-1] ;

for ( j = k = 0 ; j < n ; j++ )

if ( j != i ) b[k++] = a[j] ;

Function(b,n-1);

delete [] b ;

}

else 直接输出这个数组;

输出a数组

}

程序超简单的说,我就不详细写了,呵呵,算法你要明白

代码如下,望采纳。

#include<iostream>

#include<cmath>

#define K1 ((int)pow(20,(double)i))

using namespace std;

int main()

{

cout<<"本程序目的为求P(A),即求子集其中集合形式为{1,2,3n}"<<endl;

cout<<"请输入:"<<endl;

int n;

while(cin>>n)

{

cout<<"P("<<n<<")"<<"为:"<<endl;

int N,i=1;

N=((int)(pow((double)2,(double)n)));

inta;

a=new int[N];

intb;

b=new int[N];

for(int m=0;m<N;m++)

a[m]=new int[n];

for(int m=0;m<N;m++)

{

for(int p=0;p<n;p++)

a[m][p]=0;

b[m]=0;

}

a[1][0]=1;b[1]=1;

for(;i<=n-1;i++)for(int k=K1;k>=K1&&k<2K1;k++)

{

for(int m=0;m<b[k-K1];m++)

a[k][m]=a[k-K1][m];

b[k]=b[k-K1];

a[k][b[k]]=i+1;

b[k]++;

}

for(int m=0;m<N;m++)

{

cout<<"{";

if(b[m]>0)for(int k=0;k<b[m];k++)cout<<a[m][k]<<(k==b[m]-1"}":",");

else cout<<"}";

cout<<" ";

}

delete[]b;b=0;

delete[]a;a=0;

cout<<endl<<endl;

cout<<"请输入:"<<endl;

}

return 0;

}

我写的,你编译一下,改一改就行了。

voidunion(linklistl1,linklistl2,linklist&l3)//交集

{

linklistp=l1->next,q=l2->next,s,c;

l3=(linklist)malloc(sizeof(linklist));

l3->next=null;

c=l3;

while(p!=null&&q!=null)

{if(p->data<q->data)

{s=(linklist)malloc(sizeof(linklist));//复制结点

s->data=p->data;

c->next=s;c=s;

p=p->next;

}

elseif(p->data>q->data)

{s=(linklist)malloc(sizeof(linklist));

s->data=q->data;

c->next=s;c=s;

q=q->next;

}

else

{

s=(linklist)malloc(sizeof(linklist));

s->data=p->data;

c->next=s;c=s;

p=p->next;

q=q->next;

}

}

while(q!=null)

{

s=(linklist)malloc(sizeof(linklist));

s->data=q->data;

c->next=s;c=s;

q=q->next;

}

c->next=null;

while(p!=null)

{

s=(linklist)malloc(sizeof(linklist));

s->data=p->data;

c->next=s;c=s;

p=p->next;

}

c->next=null;

}

你的程序太乱了。应该重写。先写一个查找函数IsAtSet(set, size, elem),用于判断某元素是否在集合中。再写一个插入函数InsertToSet(set, size, elem),用于将某元素插入到集合中。源代码可如下

#include <stdioh>

bool IsAtSet(int set[], int size, int elem);

void InsertToSet(int set[], int size, int elem);

void main()

{

int set_a[100000], set_b[100000], set_d[100000];

int i, size_a, size_b, size_d = 0;

scanf("%d %d", &size_a, &size_b);

for(i = 0; i < size_a; i++)

scanf("%d", &set_a[i]);

for(i = 0; i < size_b; i++)

scanf("%d", &set_b[i]);

for(i = 0; i < size_a; i++)

{

if(!IsAtSet(set_b, size_b, set_a[i]))

{

InsertToSet(set_d, size_d, set_a[i]);

size_d++;

}

}

for(i = 0; i < size_d; i++)

printf("%d ", set_d[i]);

}

#include<iostream>

using namespace std;

//类模板

template<class T>

class vector

{

public:

void sort(T a[],int n);

T sum(T a[],int n);

int search(T e, T a[], int n);

};

//排序

template<class T>

void vector<T>::sort(T a[],int n)

{

T temp;

bool exchange;

for(int i = 1; i < n; i++)

{

exchange = false;

for(int j = n-1; j >= i; j--)

if(a[j] < a[j-1])

{

temp = a[j]; a[j] = a[j-1]; a[j-1] = temp;

exchange = true;

}

if(!exchange)

return;

}

}

//求和

template<class T>

T vector<T>::sum(T a[],int n)

{

T sum = a[0];

for(int i = 1; i < n; i++)

sum += a[i];

return sum;

}

//查找

template<class T>

int vector<T>::search(T e, T a[], int n)

{

for(int i = 0; i < n; i++)

if(a[i] == e)

return i;

return -1;

}

void main()

{

int data[5] = {5,4,3,2,1};

vector<int> obj;

cout<<"数组和为:"<<objsum(data,5)<<endl;

cout<<"数字4在数组中的位置是:"<<objsearch(4,data,5)<<endl;

cout<<"排序前数组各元素为:"<<endl;

for(int i = 0; i < 5; i++)

cout<<data[i]<<" ";

cout<<endl;

cout<<"排序后数组各元素为:"<<endl;

for(i = 0; i < 5; i++)

cout<<data[i]<<" ";

cout<<endl;

}

以上就是关于编写一个程序,列出{1,2,3....n}这个集合的所有子集,包括空集合。n为有限个。全部的内容,包括:编写一个程序,列出{1,2,3....n}这个集合的所有子集,包括空集合。n为有限个。、C++ 求一个集合的所有子集、求集合{1,2,3.......n}的子集,每次输入n,输出所有子集。请问用C++怎么做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9406679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存