#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENT_MAX 8
struct num_set_t{
int element_count;
int elements[ELEMENT_MAX];
};
typedef struct num_set_t Num_Set;
void spilt_set(Num_Set *num_set, int pos, int *header, Num_Set *rest_set) {
int i, j, k;
(*header) = num_set->elements[pos];
i = 0;
for (j = 0; j < pos; j++) {
rest_set->elements[i] = num_set->elements[j];
i++;
} //for
for (k = (pos + 1); k < num_set->element_count; k++) {
rest_set->elements[i] = num_set->elements[k];
i++;
} //for
rest_set->element_count = i;
}
void display_set(Num_Set *num_set) {
int i = 0;
fprintf(stderr, "( ");
for (i = 0; i < num_set->element_count; i++) {
fprintf(stderr, "%d ", num_set->elements[i]);
} //for
fprintf(stderr, ")\n");
}
void make_num_set(Num_Set *num_set, Num_Set *result_set) {
int i, j, k;
int header = 0;
int base = 10;
Num_Set rest;
Num_Set tmp_result;
//display_set(num_set);
if (num_set->element_count == 1) {
result_set->elements[0] = num_set->elements[0];
result_set->element_count = 1;
}
else {
// work out the base
for (i = 0; i < (num_set->element_count - 2); i++) {
base *= 10;
} //for
j = 0;
for (i = 0; i < num_set->element_count; i++) {
memset(&rest, 0, sizeof(rest));
spilt_set(num_set, i, &header, &rest);
//display_set(&rest);
memset(&tmp_result, 0, sizeof(tmp_result));
make_num_set(&rest, &tmp_result);
//compute the result numbers.
for (k = 0; k < tmp_result.element_count; k++) {
result_set->elements[j] = header * base + tmp_result.elements[k];
//fprintf(stderr, "%d = %d * %d + %d\n", result_set->elements[j], header, base, tmp_result.elements[k]);
j++;
} //for
result_set->element_count = j;
} //for
}
}
int main()
{
int i;
Num_Set num_set;
Num_Set result_set;
num_set.element_count = 3;
for (i = num_set.element_count; i > 0; i--) {
num_set.elements[i - 1] = i;
} //for
make_num_set(&num_set, &result_set);
for (i = 0; i < result_set.element_count; i++) {
fprintf(stderr, "%d\n", result_set.elements[i]);
} //for
return 0;
}