题目

类型:数学
image.png

解题思路

乘积的位数要么是 2 n ,要么是 2 n - 1 。

当数位 n > 1 时,总能在数位为 2 * n 中找到答案。
利用回文串的特性只需枚举回文串的前半部分即可

在枚举前半部分时按照「从大到小」进行,即可确保找到的第一个合法值为最大数,对于一个数位为 n 的最大数为 10^n - 1 。
当枚举到回文串的前半部分利用回文串特性构造出具实际的回文数值 nums ,随后检查 nums 能否分解成数位为 n 的数对 (a, b) ,利用乘法具有交换律, 只需要枚举数对中的较大数即可。

代码

  1. class Solution {
  2. public int largestPalindrome(int n) {
  3. if (n == 1) return 9;
  4. int max = (int) Math.pow(10, n) - 1;
  5. for (int i = max; i >= 0; i--) {
  6. long num = i, t = i;
  7. while (t != 0) {
  8. num = num * 10 + (t % 10);
  9. t /= 10;
  10. }
  11. for (long j = max; j * j >= num; j--) {
  12. if (num % j == 0) return (int)(num % 1337);
  13. }
  14. }
  15. return -1;
  16. }
  17. }