fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <math.h>
  6.  
  7. #define same_digits(x, y) num_digits(x) == num_digits(y) ? 1 : 0
  8.  
  9. typedef struct arguments {
  10. long int min;
  11. long int max;
  12. } Args;
  13.  
  14. short num_digits(long int num) {
  15. short count = 0;
  16. while (num != 0) {
  17. num /= 10;
  18. ++count;
  19. }
  20. return count;
  21. }
  22.  
  23. bool is_palindrome(long int num) {
  24. short digits = num_digits(num);
  25. char buffer[digits + 1];
  26. sprintf(buffer, "%ld", num);
  27. int i;
  28. size_t len = strlen(buffer);
  29. char *reversed = NULL;
  30. reversed = calloc(digits + 1, sizeof(char));
  31. for (i = len - 1; i >= 0; i--)
  32. reversed[len - 1 - i] = buffer[i];
  33. long int new_num;
  34. int n = sscanf(reversed, "%ld", &new_num);
  35. free(reversed);
  36. if (n == 1 && num == new_num) {
  37. return true;
  38. }
  39. return false;
  40. }
  41.  
  42. void *largest(void *arg) {
  43. Args *args = (Args *) arg;
  44. long int min = args->min;
  45. long int max = args->max;
  46. long int i, j;
  47. for (i = max; i >= min; i--) {
  48. if (is_palindrome(i) == false)
  49. continue;
  50. int root = (int) sqrt(i);
  51. for (j = 2; j <= root; j++) {
  52. if (i % j == 0) {
  53. if (same_digits(j, (i/j))) {
  54. printf("%ld\t*\t%ld\t=\t%ld\n", j, (i/j), i);
  55. return NULL;
  56. }
  57. }
  58. }
  59. }
  60. return NULL;
  61. }
  62.  
  63. int main(void) {
  64. int num;
  65. while (fscanf(stdin, "%d", &num) == 1) {
  66. if (num == 1) {
  67. Args *arguments = NULL;
  68. arguments = calloc(1, sizeof(Args));
  69. arguments->min = 1;
  70. arguments->max = 10;
  71. largest((void *) arguments);
  72. free(arguments);
  73. } else {
  74. long int min = pow(10, (num * 2) - 1);
  75. long int max = pow(10, (num * 2));
  76. Args *args = NULL;
  77. args = calloc(1, sizeof(Args));
  78. args->min = min;
  79. args->max = max;
  80. largest((void *) args);
  81. }
  82. }
  83. return EXIT_SUCCESS;
  84. }
Success #stdin #stdout 0.26s 9432KB
stdin
1
2
3
4
stdout
3	*	3	=	9
91	*	99	=	9009
913	*	993	=	906609
9901	*	9999	=	99000099