以下是以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++怎么做等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)