Problem 4
斜めに総当たり戦する感じです.
#include <iostream> #include <cmath> using namespace std; #define MAX 999 bool isPalindrome(int n) { bool f = false; if (100000 <= n && n <= 999999) { char l[4], r[4]; // 下3桁を反転 for (int i = 0; i < 3; i++) { r[i] = '0' + n%10; n /= 10; } // 上3桁をそのまま for (int i = 2; i >= 0; i--) { l[i] = '0' + n%10; n /= 10; } l[3] = r[3] = '\0'; if (strcmp(l, r) == 0) { f = true; } } return f; } int trace(int _l, int _r) { int r = -1; for (int i = 0; _l+i <= MAX || _r+i <= MAX; i++) // 右上に上っていく { int x = _l-i; int y = _r+i; if (x > MAX || y > MAX || x*y <= 0) { break; } if (isPalindrome(x*y)) { r = x*y; break; } } return r; } int main(int argc, char **argv) { int ans = -1; for (int n = MAX; n >= 0; n--) { if ((ans = trace(n, n)) != -1) { break; } if ((ans = trace(n-1, n)) != -1) { break; } if(n == 953) break; } cout << ans << endl; return 0; }