例如:输入为[1,2,5,8]
输出为[],[1],[2],[5],[8],...[1,2,5,8]
// 输出数组的全部子集
//用递归
//不使用string类
//***********memset绝对不要过界。常数一定要定义成不变常量
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
//#include <string>
using namespace std;
int MAXN=100;//数组最大长度
// 选一个malloc的其实大小。
int BLANKNUM=3;//空集[]\0占3字节
typedef struct MyStr{
char* data;
int sizeOfData;
}MyStr;
//计算一个整数的位数
int NumOfInt(int e){
char a[100];
int i=0;
sprintf(a,"%d",e);
while(a[i]!='\0'){
i++;
}
return i;
}
MyStr AddForEach(MyStr mys,int e){
//用]分割string,为每个[] 中添加e;
int num=1;
MyStr re;
re.data=(char *)malloc(num); //malloc后一定要memset
memset(re.data,'\0',num);
re.sizeOfData=num;
int digitalLength=NumOfInt(e);
bool isBlank =true;//控制[后有没有数字
bool leftBraket=false;//左括号已存在标志
for(int i=0;i<mys.sizeOfData-1 && mys.data[i]!='\0';i++){
char c[2];
sprintf(c,"%c",mys.data[i]);
if('['==mys.data[i]){
leftBraket=true;
isBlank =true;
num=re.sizeOfData+1;
re.data=(char *)realloc(re.data,num);
strcat(re.data,c);
}else if(']'==mys.data[i]){
num=re.sizeOfData+ digitalLength+1+(isBlank?0:1);//]的占位
re.data=(char *)realloc(re.data,num);
if(!isBlank) strcat(re.data,",");
strcat(re.data,to_string(e).c_str());
strcat(re.data,c);
leftBraket=false;
}else{
if(leftBraket && isBlank) isBlank=false;//左括号已有,紧接着是非右括号的字符,说明不为空。
num=re.sizeOfData+1;
re.data=(char *)realloc(re.data,num);//
strcat(re.data,c);
}
re.sizeOfData=num;
}
return re;
}
MyStr FindSubSet(const int a[],int n){//找数组的所有子集,n是数组元素有效个数
MyStr re;
if(n==0){
re.data=(char *)malloc(BLANKNUM);
memset(re.data,'\0',BLANKNUM);
strcpy(re.data,"[]");
re.sizeOfData=BLANKNUM;
return re;
}
int t=--n;
re=FindSubSet(a,t);
MyStr re2=AddForEach(re,a[t]);
int num=re.sizeOfData+re2.sizeOfData;//-1+1:去除一个'\0',加上一个,
re.data=(char *)realloc(re.data,num);
strcat(re.data,re2.data);
re.sizeOfData=num;
free(re2.data);
return re;
}
int main()
{
int n;
int a[MAXN];
printf("输入数组长度:\n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("输入第%d个数",i+1);
// getchar();
scanf("%d",&a[i]);
}
MyStr ms=FindSubSet(a,4);
cout << ms.data<< endl;
free(ms.data);
return 0;
}