C++ 求一个数组的全部子集(不使用string类型)

例如:输入为[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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值