元素个数为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 查看评论