#include #include #include #include #include char *reverse(char *s){ char *rev = malloc(strlen(s)); int j = 0; for (int i = strlen(s)-1; i >= 0; i--){ rev[j] = s[i]; j++; } rev[j] = 0; return rev; } bool ispal(int n){ char *strnum = malloc(128); snprintf(strnum, 128, "%d", n); char *rev = reverse(strnum); if (strcmp(rev, strnum) == 0) { // is the same both ways round free(strnum); free(rev); return true; } free(strnum); free(rev); return false; } int findhighestsumof2(int sums[][2], int sumcount){ int highest = sums[0][0]; int highestIndex = 0; for (int i = 0; i < sumcount; i++) { if (sums[i][0] > highest) { highest= sums[i][0]; highestIndex = i; } if (sums[i][1] > highest) { highest = sums[i][1]; highestIndex = i; } } return highestIndex; } int findlowesetsumof2(int sums[][2], int sumcount){ if (sumcount == 0) return -1; // no sums int lowest = sums[0][0]; int lowestIndex = 0; bool needscheck = false; for (int i = 0; i < sumcount; i++) { if (sums[i][0] < lowest) { lowest = sums[i][0]; lowestIndex = i; needscheck = false; } if (sums[i][1] < lowest) { lowest = sums[i][1]; lowestIndex = i; needscheck = false; } if (sums[i][0] == lowest || sums[i][1] == lowest) needscheck == true; } if (needscheck) return findhighestsumof2(sums, sumcount); return lowestIndex; } int findhighestsumof3(int sums[][3], int sumcount){ int highest = sums[0][0]; int highestIndex = 0; for (int i = 0; i < sumcount; i++) { if (sums[i][0] > highest) { highest= sums[i][0]; highestIndex = i; } if (sums[i][1] > highest) { highest = sums[i][1]; highestIndex = i; } if (sums[i][2] > highest) { highest = sums[i][2]; highestIndex = i; } } return highestIndex; } int findlowesetsumof3(int sums[][3], int sumcount){ if (sumcount == 0) return -1; // no sums // int lowest = sums[0][0]; int lowestIndex = 0; bool needscheck = false; for (int i = 0; i < sumcount; i++) { if (sums[i][0] < lowest) { lowest = sums[i][0]; lowestIndex = i; needscheck = false; } if (sums[i][1] < lowest) { lowest = sums[i][1]; lowestIndex = i; needscheck = false; } if (sums[i][2] < lowest) { lowest = sums[i][2]; lowestIndex = i; needscheck = false; } if (sums[i][0] == lowest || sums[i][1] == lowest || sums[i][0] == lowest) needscheck == true; } if (needscheck) return findhighestsumof3(sums, sumcount); return lowestIndex; } int main(int argc, char **argv){ int input; if (argc == 1) { assert(scanf("%d", &input) != 0); } else input = atoi(argv[1]); if (ispal(input)) { // if 1 number is enough printf("%d\n", input); return 1; } int sums[input*2][2]; int sumcount = 0; for (int i = 1; i < input/2+1; i++){ // if 2 is enough for (int j = input; j > (input/2) - 1; j--){ if ((i + j) == input) { if (ispal(i) & ispal(j)){ sums[sumcount][0] = i; sums[sumcount][1] = j; sumcount++; } } } } int index = findlowesetsumof2(sums, sumcount); if (index != -1) { printf("%d %d\n", sums[index][0], sums[index][1]); return 2; } int triples[input*3][3]; int triplecount = 0; for (int i = 0; i < input; i++){ // if 3 is enough for (int j = 0; j < input; j++){ for (int k = 0; k < input; k++){ if ((i + j + k) == input) { if (ispal(i) & ispal(j) & ispal(k)){ triples[triplecount][0] = i; triples[triplecount][1] = j; triples[triplecount][2] = k; triplecount++; } } } } } index = findlowesetsumof3(triples, triplecount); if (index != -1) { printf("%d %d %d\n", triples[index][0], triples[index][1], triples[index][2]); return 3; } }