#Update: C (function f), 92# Even as a function, this is still the longest entry here. It's the first time I've passed an array of unknown length as a function argument in C, and apparently there is no way for a C function to know the length of an array passed to it, as the argument is passed as a pointer (regardless of the syntax used). Hence a second argument is required to indicate the length. I kept the output to stdout, because setting up an integer array and returning it would almost certainly be longer. Thanks to Dennis for the tips. See the function `f` (92 characters excluding unnecessary whitespace) in the test programs below. **Output via printf** j; f(int c,int*x){ int p=1,i; for(i=c<<c;i--;p=i%c?p:!!printf("%d ",p))p*=(i/c>>i%c)&1?1:x[i%c]; } main(int d,char**v){ d--; int y[d]; for(j=d;j--;)y[j]=atoi(v[j+1]); f(d,y); } **Output via array pointer** j,q[512]; f(int c,int*x,int*p){ for(int i=-1;++i-(c<<c);p[i/c]*=(i/c>>i%c)&1?1:x[i%c])i%c||(p[i/c]=1); } main(int d,char**v){ d--; int y[d]; for(j=d;j--;)y[j]=atoi(v[j+1]); f(d,y,q); for(j=1<<d;j--;)printf("%d ",q[j]); } #C (program),108# excluding unnecessary whitespace. p=1,i; main(int c,char**v){ c-=1; for(i=c<<c;i--;i%c||(printf("%d ",p),p=1))(i/c>>i%c)&1||(p*=atoi(v[i%c+1])); } Input from commandline, output to stdout. C isn't going to win here, but maybe I will try converting to a function tomorrow. Basically we iterate through all `1<<c` combinations of primes, with each bit of `i/c` being associated with the presence or absence of a particular prime in the product. The "inner loop" `i%c` runs through the primes, multiplying them according to the value of `i/c.` When `i%c` reaches 0, the product is output, then set to 1 for the next "outer" iteration. curiously, `printf("%d ",p,p=1)` does not work (it always prints a 1.) This is not the first time I have seen odd behaviour when a value is used in a `printf` and assigned later in the same bracket. It is possible in this case that the second comma is not being treated as an argument separator, but rather as an operator. **Usage** $ ./a 2 3 5 7 1 2 3 6 5 10 15 30 7 14 21 42 35 70 105 210