#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#define same_digits(x, y) num_digits(x) == num_digits(y) ? 1 : 0
typedef struct arguments {
long int min;
long int max;
} Args;
short num_digits(long int num) {
short count = 0;
while (num != 0) {
num /= 10;
++count;
}
return count;
}
bool is_palindrome(long int num) {
short digits = num_digits(num);
char buffer[digits + 1];
int i;
char *reversed = NULL;
reversed
= calloc(digits
+ 1, sizeof(char)); for (i = len - 1; i >= 0; i--)
reversed[len - 1 - i] = buffer[i];
long int new_num;
int n
= sscanf(reversed
, "%ld", &new_num
); if (n == 1 && num == new_num) {
return true;
}
return false;
}
void *largest(void *arg) {
Args *args = (Args *) arg;
long int min = args->min;
long int max = args->max;
long int i, j;
for (i = max; i >= min; i--) {
if (is_palindrome(i) == false)
continue;
int root
= (int) sqrt(i
); for (j = 2; j <= root; j++) {
if (i % j == 0) {
if (same_digits(j, (i/j))) {
printf("%ld\t*\t%ld\t=\t%ld\n", j
, (i
/j
), i
); return NULL;
}
}
}
}
return NULL;
}
int main(void) {
int num;
while (fscanf(stdin
, "%d", &num
) == 1) { if (num == 1) {
Args *arguments = NULL;
arguments
= calloc(1, sizeof(Args
)); arguments->min = 1;
arguments->max = 10;
largest((void *) arguments);
} else {
long int min
= pow(10, (num
* 2) - 1); long int max
= pow(10, (num
* 2)); Args *args = NULL;
args
= calloc(1, sizeof(Args
)); args->min = min;
args->max = max;
largest((void *) args);
}
}
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgkjaW5jbHVkZSA8c3RkbGliLmg+CgkjaW5jbHVkZSA8c3RyaW5nLmg+CgkjaW5jbHVkZSA8c3RkYm9vbC5oPgoJI2luY2x1ZGUgPG1hdGguaD4KCgkjZGVmaW5lIHNhbWVfZGlnaXRzKHgsIHkpICAgbnVtX2RpZ2l0cyh4KSA9PSBudW1fZGlnaXRzKHkpID8gMSA6IDAKCgl0eXBlZGVmIHN0cnVjdCBhcmd1bWVudHMgewoJCWxvbmcgaW50IG1pbjsKCQlsb25nIGludCBtYXg7Cgl9IEFyZ3M7CgoJc2hvcnQgbnVtX2RpZ2l0cyhsb25nIGludCBudW0pIHsKCQlzaG9ydCBjb3VudCA9IDA7CgkJd2hpbGUgKG51bSAhPSAwKSB7CgkJCW51bSAvPSAxMDsKCQkJKytjb3VudDsKCQl9CgkJcmV0dXJuIGNvdW50OwoJfQoKCWJvb2wgaXNfcGFsaW5kcm9tZShsb25nIGludCBudW0pIHsKCQlzaG9ydCBkaWdpdHMgPSBudW1fZGlnaXRzKG51bSk7IAoJCWNoYXIgYnVmZmVyW2RpZ2l0cyArIDFdOwoJCXNwcmludGYoYnVmZmVyLCAiJWxkIiwgbnVtKTsKCQlpbnQgaTsKCQlzaXplX3QgbGVuID0gc3RybGVuKGJ1ZmZlcik7CgkJY2hhciAqcmV2ZXJzZWQgPSBOVUxMOwoJCXJldmVyc2VkID0gY2FsbG9jKGRpZ2l0cyArIDEsIHNpemVvZihjaGFyKSk7CgkJZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pCgkJCXJldmVyc2VkW2xlbiAtIDEgLSBpXSA9IGJ1ZmZlcltpXTsKCQlsb25nIGludCBuZXdfbnVtOwoJCWludCBuID0gc3NjYW5mKHJldmVyc2VkLCAiJWxkIiwgJm5ld19udW0pOwoJCWZyZWUocmV2ZXJzZWQpOwoJCWlmIChuID09IDEgJiYgbnVtID09IG5ld19udW0pIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgl2b2lkICpsYXJnZXN0KHZvaWQgKmFyZykgewoJCUFyZ3MgKmFyZ3MgPSAoQXJncyAqKSBhcmc7CgkJbG9uZyBpbnQgbWluID0gYXJncy0+bWluOwoJCWxvbmcgaW50IG1heCA9IGFyZ3MtPm1heDsKCQlsb25nIGludCBpLCBqOwoJCWZvciAoaSA9IG1heDsgaSA+PSBtaW47IGktLSkgewoJCQlpZiAoaXNfcGFsaW5kcm9tZShpKSA9PSBmYWxzZSkKCQkJCWNvbnRpbnVlOwoJCQlpbnQgcm9vdCA9IChpbnQpIHNxcnQoaSk7CgkJCWZvciAoaiA9IDI7IGogPD0gcm9vdDsgaisrKSB7CgkJCQlpZiAoaSAlIGogPT0gMCkgewoJCQkJCWlmIChzYW1lX2RpZ2l0cyhqLCAoaS9qKSkpIHsKCQkJCQkJcHJpbnRmKCIlbGRcdCpcdCVsZFx0PVx0JWxkXG4iLCBqLCAoaS9qKSwgaSk7CgkJCQkJCXJldHVybiBOVUxMOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gTlVMTDsKCX0KCglpbnQgbWFpbih2b2lkKSB7CgkJaW50IG51bTsKCQl3aGlsZSAoZnNjYW5mKHN0ZGluLCAiJWQiLCAmbnVtKSA9PSAxKSB7CgkJCWlmIChudW0gPT0gMSkgewoJCQkJQXJncyAqYXJndW1lbnRzID0gTlVMTDsKCQkJCWFyZ3VtZW50cyA9IGNhbGxvYygxLCBzaXplb2YoQXJncykpOwoJCQkJYXJndW1lbnRzLT5taW4gPSAxOwoJCQkJYXJndW1lbnRzLT5tYXggPSAxMDsKCQkJCWxhcmdlc3QoKHZvaWQgKikgYXJndW1lbnRzKTsKCQkJCWZyZWUoYXJndW1lbnRzKTsKCQkJfSBlbHNlIHsKCQkJCWxvbmcgaW50IG1pbiA9IHBvdygxMCwgKG51bSAqIDIpIC0gMSk7CgkJCQlsb25nIGludCBtYXggPSBwb3coMTAsIChudW0gKiAyKSk7CgkJCQlBcmdzICphcmdzID0gTlVMTDsKCQkJCWFyZ3MgPSBjYWxsb2MoMSwgc2l6ZW9mKEFyZ3MpKTsKCQkJCWFyZ3MtPm1pbiA9IG1pbjsKCQkJCWFyZ3MtPm1heCA9IG1heDsKCQkJCWxhcmdlc3QoKHZvaWQgKikgYXJncyk7CgkJCX0KCQl9CgkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKCX0=