Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

C语言递归求解集合的所有子集

$
0
0

元素个数为n的集合有 2^n个子集,可以用bit的值 1,0表示一个元素是否在子集中


subsets.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX_SETS_SIZE 1024

char *bitmap = NULL;
char *sets = NULL;
int subset_count = 0;

void subsets(char *bitmap,char *sets,int bitpos,int maxpos);
void print(char *bitmap,char *sets,int maxpos);                 // print every subsets
void setbit(char *bitmap,int bitpos,int bit);                   // set specified bit value
int getbit(char *bitmap,int bitpos);                            // get a specified bit value

int main(){

    char tmp[MAX_SETS_SIZE];
    printf("Enter a sets (eg. ABCDEFG): ");
    fgets(tmp,MAX_SETS_SIZE - 2,stdin);
    int length = strlen(tmp);

    sets = tmp;
    length -= 1;        // fgets function will saved the last input character '\n',so ,we should delete it
    tmp[length] = '\0';
    bitmap = (char *)malloc(length / 8 + 1);        // malloc enough memory as bitmap
    assert(bitmap != NULL);                         // when malloc faild,program terminate

    subsets(bitmap,sets,0,length);

    printf("\nSets: %s\nCount: %d\n\n",sets,subset_count);
    free(bitmap);

    return 0;
}


void subsets(char *bitmap,char *sets,int bitpos,int maxpos){
    if(bitpos == maxpos){
        ++ subset_count;
        print(bitmap,sets,maxpos);
        return;
    }
    
    for(int bit = 0; bit < 2; ++bit){
        setbit(bitmap,bitpos,bit);
        subsets(bitmap,sets,bitpos + 1,maxpos);
    }


}
    


void setbit(char *bitmap,int bitpos,int bit){
    int byte_offset = bitpos / 8;
    int bit_offset = bitpos % 8;
    if(bit == 1){ 
        *(bitmap + byte_offset) |= ((unsigned char)1 << bit_offset);
    }else{
        *(bitmap + byte_offset) &= (~((unsigned char)1 << bit_offset));
    }
}

int getbit(char *bitmap,int bitpos){
    int byte_offset = bitpos / 8;
    int bit_offset = bitpos % 8;
    if( *(bitmap + byte_offset) & ((unsigned char)1 << bit_offset)){
        return 1;
    }else{
        return 0;
    }
}

void print(char *bitmap,char *sets,int maxpos){
    for(int i = 0; i < maxpos; ++i){
        if(getbit(bitmap,i)){
            printf("%c ",*(sets + i));
        }
    }
    printf("\n");
}



编译

gcc subsets.c -o subsets -std=c99

./subsets


作者:wxyztuv 发表于2013-6-17 9:52:08 原文链接
阅读:0 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>