Для этого вам не нужны вложенные циклы. Вам нужна одна рекурсивная функция для вывода двоичного значения длины N и цикла for для итерации по всем числам [0 .. (2 ^ N) -1].
Решение user949300 также очень хорошо, но может работать не на всех языках.
Вот мое решение (я), рекурсивное примерно в два раза медленнее итеративного:
#include <stdio.h>
#ifdef RECURSIVE
void print_bin(int num, int len)
{
if(len == 0)
{
printf("\n");
return;
}
print_bin(num >> 1, len -1);
putchar((num & 1) + '0');
}
#else
void print_bin(int num, int len)
{
char str[len+1];
int i;
str[len] = '\0';
for (i = 0; i < len; i++)
{
str[len-1-i] = !!(num & (1 << i)) + '0';
}
printf("%s\n", str);
}
#endif
int main()
{
int len = 24;
int i;
int end = 1 << len;
for (i = 0; i < end ; i++)
{
print_bin(i, len);
}
return 0;
}
(Я сам попробовал это на Mac, печатая все двоичные числа длиной 24, и терминал завис. Но это, вероятно, плохая реализация терминала.: -)
$ gcc -O3 binary.c ; time ./a.out > /dev/null ; gcc -O3 -DRECURSIVE binary.c ; time ./a.out > /dev/null
real 0m1.875s
user 0m1.859s
sys 0m0.008s
real 0m3.327s
user 0m3.310s
sys 0m0.010s