Power set: Difference between revisions

Content added Content deleted
(→‎{{header|Perl 6}}: simplify, supply alternative impl)
(→‎{{header|C}}: rewrite to remove size limit)
Line 224: Line 224:


=={{header|C}}==
=={{header|C}}==
<lang c>#include <limits.h>
<lang c>#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>


struct node {
static void powerset(int argc, char** argv)
char *s;
{
struct node* prev;
unsigned int i, j, bits, i_max = 1U << argc;
};


void powerset(char **v, int n, struct node *up)
if (argc >= sizeof(i) * CHAR_BIT) {
{
fprintf(stderr, "Error: set too large\n");
struct node me;
exit(1);
}


if (!n) {
for (i = 0; i < i_max ; ++i) {
putchar('[');
printf("{");
while (up) {
for (bits = i, j = 0; bits; bits >>= 1, ++j) {
printf(" %s", up->s);
if (bits & 1)
up = up->prev;
printf(bits > 1 ? "%s, " : "%s", argv[j]);
}
}
printf("}\n");
puts(" ]");
} else {
}
me.s = *v;
me.prev = up;
powerset(v + 1, n - 1, up);
powerset(v + 1, n - 1, &me);
}
}
}


int main(int argc, char* argv[])
int main(int argc, char **argv)
{
{
powerset(argc - 1, argv + 1);
powerset(argv + 1, argc - 1, 0);
return 0;
return 0;
}</lang>output<lang>% ./a.out 1 2 3 4
}</lang>
{}
{{out}}
<pre>
{1}
% ./a.out 1 2 3
{2}
[ ]
{1, 2}
[ 3 ]
{3}
[ 2 ]
{1, 3}
{2, 3}
[ 3 2 ]
{1, 2, 3}
[ 1 ]
[ 3 1 ]
{4}
{1, 4}
[ 2 1 ]
[ 3 2 1 ]
{2, 4}
</pre>
{1, 2, 4}
{3, 4}
{1, 3, 4}
{2, 3, 4}
{1, 2, 3, 4}</lang>


=={{header|C++}}==
=={{header|C++}}==