
我们先来看题目描述给定一个整数 n 返回 可表示为两个 n 位整数乘积的 最大回文整数。因为答案可能非常大所以返回它对 1337 取余。示例 1输入n 2 输出987 解释99 x 91 9009, 9009 % 1337 987示例 2输入n 1 输出9提示1 n 8解决方案方法一枚举思路和算法我们可以从大到小枚举回文数由于确定了回文数的左半部分其右半部分也就确定了因此我们只需要枚举左半部分同时由于两个 n 位整数的乘积至多是个 2n 位数我们可以从 10n−1 开始枚举回文数的左半部分。得到回文数 p 后需要判断其能否分解成两个 n 位整数。我们可以从 10n−1 开始从大到小枚举 x若 x 能整除 p 且 x 和 p/x 均为 n 位整数则 p 就是我们要找的答案。代码实现时在枚举 x 时枚举到 ⌈根号p⌉ 即可因为继续枚举的话有 x p/x若 x 为 p 的因子则说明更大的 p/x 也是 p 的因子但是前面枚举 x 的过程中并没有找到 p 的因子矛盾。实际结果表明上述算法在 n1 时总能找到答案而 n1 时的答案为 9是个 1 位数需要特判这种情况。代码Python3class Solution: def largestPalindrome(self, n: int) - int: if n 1: return 9 upper 10 ** n - 1 for left in range(upper, upper // 10, -1): # 枚举回文数的左半部分 p, x left, left while x: p p * 10 x % 10 # 翻转左半部分到其自身末尾构造回文数 p x // 10 x upper while x * x p: if p % x 0: # x 是 p 的因子 return p % 1337 x - 1Cclass Solution { public: int largestPalindrome(int n) { if (n 1) { return 9; } int upper pow(10, n) - 1; for (int left upper;; --left) { // 枚举回文数的左半部分 long p left; for (int x left; x 0; x / 10) { p p * 10 x % 10; // 翻转左半部分到其自身末尾构造回文数 p } for (long x upper; x * x p; --x) { if (p % x 0) { // x 是 p 的因子 return p % 1337; } } } } };