您的位置:首页 > 其它

求集合的幂集

2012-11-06 16:03 155 查看
/* 求集合的幂集 */
#include <stdio.h>
#include <stdlib.h>

#define SET_LEN 5

typedef struct {
char *elem;
int card;
} set;

typedef struct {
int *stat;
int n;
} fsm;

double fac(int n) {
if (n == 0 || n == 1)
return 1;
return n * fac(n-1);
}

double comb(int n, int k) {
return fac(n)/(fac(k)*fac(n-k));
}

void init_set(set *s, char *elem, int card) {
s->elem = elem;
s->card = card;
}

void init_fsm(fsm *s, int n) {
s->stat = (int *)malloc(sizeof(int)*n);
s->n = n;
for (int i = 0; i < n; i++)
s->stat[i] = i;
}

void print_stat(set *s, fsm *m) {
for (int i = 0; i < m->n; i++)
printf("%c", s->elem[m->stat[i]]);
puts("");
}

void mv(fsm *m) {
int *r = &(m->stat[m->n-1]);
(*r)++;
}

int update_which(set *s, fsm *m) {
int t = s->card - 1;
for (int i = m->n-1; i >= 0; i--) {
if (m->stat[i] != t)
return i;
t--;
}
return 0;
}

void update(set *s, fsm *m) {
int t = update_which(s, m);
int *u = &(m->stat[t]);
(*u)++;
for (int i = *u+1, j = t+1; j < m->n; i++, j++)
m->stat[j] = i;
}

void trans_stat(set *s, fsm *m) {
int *r = &(m->stat[m->n-1]);
int t = s->card - 1;

if (*r != t)
mv(m);
else
update(s, m);
}

void print_subset(set *s, fsm *m) {
for (int i = 0; i < comb(s->card, m->n); i++) {
print_stat(s, m);
trans_stat(s, m);
}
}

void print_powset(set *s) {
puts("{}");
for (int i = 1; i <= s->card; i++) {
fsm *m = (fsm *)malloc(sizeof(fsm));
init_fsm(m, i);
print_subset(s, m);
free(m);
}
}

int main() {
char e[] = "abcde";
set *s = (set *)malloc(sizeof(set));

init_set(s, e, SET_LEN);
print_powset(s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: