У @paddy есть хороший ответ; только добавление немного (что касается моих крутых моментов, судя по вашему ответу на мой комментарий - немного опоздал в игру). Это полагается на pow (), (и log10 для некоторой аккуратности в печати), тем не менее; при использовании компиляции gcc с -lm
:
base
здесь может немного сбить с толку, но думаю, вы уловили смысл.
gcc -Wall -Wextra -pedantic -o combo combo.c -lm
/* gcc - Wall -Wextra -pedantic -o combo combo.c -lm */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static void prnt_combo(unsigned number, unsigned bits, int base)
{
if (!bits)
return;
prnt_combo(number / base, --bits, base);
printf("%d", number % base);
}
void prnt_combos(int bits, int base)
{
int i;
int n = pow(base, bits);
int wp = log10(n) + 1;
fprintf(stderr,
"Printing all combinations of 0 to %d by width of %d numbers. "
"Total %d.\n",
base - 1, bits, n
);
for (i = 0; i < n; i++) {
fprintf(stderr, "%*d : ", wp, i);
prnt_combo(i, bits, base);
printf("\n");
}
}
/* Usage: ./combo [<bits> [<base>]]
* Defaults to ./combo 3 2
* */
int main(int argc, char *argv[])
{
int bits = argc > 1 ? strtol(argv[1], NULL, 10) : 3;
int base = argc > 2 ? strtol(argv[2], NULL, 10) : 2;
prnt_combos(bits, base);
return 0;
}
Образец:
$ ./combo 4 2
Printing all combinations of 0 to 1 by width of 4 numbers. Total 16.
0 : 0000
1 : 0001
2 : 0010
3 : 0011
4 : 0100
5 : 0101
6 : 0110
7 : 0111
8 : 1000
9 : 1001
10 : 1010
11 : 1011
12 : 1100
13 : 1101
14 : 1110
15 : 1111
Или чистый вывод:
$ ./combo 3 2 >&2-
000
001
010
011
100
101
110
111
Вы можете добавить что-то вроде:
if (base > 10)
printf("%x", number % base);
else
printf("%d", number % base);
в prnt_combo()
. Таким образом, к 2 16 вы получите:
0 : 00
1 : 01
2 : 02
3 : 03
4 : 04
...
250 : fa
251 : fb
252 : fc
253 : fd
254 : fe
255 : ff
person
Morpfh
schedule
12.11.2012
001
отличается от010
или100
) - person madth3   schedule 13.11.2012001
, единственными вариантами будут001
,010
и100
. - person paddy   schedule 13.11.2012