Moscow Django MeetUp №14 def is_palindrome(num): x = str(num) return 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
Moscow Django MeetUp №14 #include static int is_palindrome(int num, 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; }
Moscow Django MeetUp №14 static int is_palindrome(int num, int digits) { 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; }
Moscow Django MeetUp №14 $ valgrind --tool=memcheck --leak-check=full --show-possibly-lost=no python 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
Moscow Django MeetUp №14 static int is_palindrome(pal_t num, int digits) { 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; }
Moscow Django MeetUp №14 def palindrome_factors(digits): max_num = sum(9 * (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