x == x[::-1] def palindrome_factors(digits): max_num = (10 ** digits) - 1 min_num = max_num // 10 best = (0, 0, 0) for i in range(max_num, min_num, -1): for j in range(i, min_num, -1): multi = i * j if multi > best[0] and is_palindrome(multi): best = (multi, i, j) return best
int digits) { int* check_array = malloc(digits * 2); int l = 0, i = 0; for (l = 0; num != 0; l++, num /= 10) { check_array[l] = num % 10; } for (i = 0; i < l/2; i++) { if (check_array[i] != check_array[l - i - 1]) { return 0; } } free(check_array); return 1; }
-d4 –c *** Error in `python': free(): invalid next size (fast): 0x000000000090dba0 *** (gdb) bt #4 _int_free … at malloc.c:3758 #5 0x00007ffff5aab9a8 in is_palindrome (num=0, digits=4) at cpal.c:16 #6 0x00007ffff5aabab7 in cpal_palindrome_factors (self=0x0, args=0x941b50) at cpal.c:39 (gdb) b cpal.c:16 (gdb) run Breakpoint 1, is_palindrome (num=0, digits=4) at cpal.c:16 16 free(check_array);
{ int* check_array = malloc(digits * 2 * sizeof(int)); int l = 0, i = 0; for (l = 0; num != 0; l++, num /= 10) { check_array[l] = num % 10; } for (i = 0; i < l/2; i++) { if (check_array[i] != check_array[l - i - 1]) { return 0; } } free(check_array); return 1; }
run.py -d4 -c Answer: 99000099 = (9999 x 9901) ... 79,968 bytes in 2,499 blocks are definitely lost in loss record 1,635 of 1,636 by 0x7B618CA: is_palindrome (cpal.c:8) by 0x7B61B55: cpal_palindrome_factors (cpal.c:46) by 0x4A1F7D: PyEval_EvalFrameEx (ceval.c:4021) ... LEAK SUMMARY: definitely lost: 79,968 bytes in 2,499 blocks possibly lost: 417,643 bytes in 2,380 blocks still reachable: 881,455 bytes in 6,097 blocks
{ int* check_array = malloc(digits * 2 * sizeof(int)); int l = 0, i = 0; for (l = 0; num != 0; l++, num /= 10) { check_array[l] = num % 10; } for (i = 0; i < l/2; i++) { if (check_array[i] != check_array[l - i - 1]) { return 0; } } free(check_array); return 1; }
(10 ** i) for i in range(digits)) min_num = max_num // 10 best = (0, 0, 0) for i in xrange(max_num, min_num, -1): if i**2 <= best[0]: break for j in xrange(i, min_num, -1): multi = i * j if multi <= best[0]: break if is_palindrome(multi): best = (multi, i, j) return best