I saw this problem and it begged to be brute-forced with a recursive algorithm.
int RecurseNumber(int *, int *, int *);
int main(int argc, char **argv){
int number⎖];
int used⎖];
int offset;
int i;
for(offset = 0 ; offset < 10 ; offset++){
used[offset] = 0;
}
/* 0 cannot be the first number */
for(i = 1 ; i < 10 ; i++){
numberΎ] = i;
used[i] = 1;
offset = 1;
if(RecurseNumber(used, number, &offset) == 1)
break;
used[i] = 0;
}
printf("\nnumber is : ");
for(i = 0 ; i < 10 ; i++)
printf("%d", number[i]);
printf("\n\n");
return 0;
}
int RecurseNumber(int *used, int *number, int *offset){
int i, j;
double term, val;
if(*offset == 10)
return 1; // bottom of recursion
for(i = 0 ; i < 10 ; i++){
// find an unused digit
if(used[i] == 1)
continue;
// add unused digit to array
number[*offset] = i;
used[i] = 1;
for(j = 0, val = 0 ; j < *offset + 1 ; j++){
term = number[*offset - j]*(pow(10.0, (double)j));
val += term;
}
if(fmod(val, (double)(*offset + 1)) != 0.0){
used[i] = 0; // reset this digit to unused
continue; // go on to next digit
}
else{
(*offset)++;
if(RecurseNumber(used, number, offset) == 1)
return 1;
(*offset)--;
used[i] = 0;
continue;
}
}
// no solution for this recursion path was found
return 0;
}