找到由两个 3 位数字的乘积组成的最大回文 - Javascript

新手上路,请多包涵

谁能告诉我代码有什么问题。找到最大的 palindrome 由两个 3 位数的乘积组成。

 function largestPalindrome(){

    for(var i =999; i>100; i--){
        for(var j = 999; j>100; j--){
            var mul = j*i;
            if(isPalin(mul)){
                return i * j;
            }
        }
    }
}

function isPalin(i){
    return i.toString() == i.toString().split("").reverse().join("");
}

console.log(largestPalindrome());

这个答案接近我的问题,但我仍然觉得我正在做循环的方式应该返回最大的产品。

原文由 Shane 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 392
2 个回答

Yours doesn’t work properly since it checks 999*999 , then 999*998 , then 999*997 until it reaches about 999*583 .虽然它不检查 997*995 或靠近顶部的东西会产生更大的数字

function largestPalindrome(){

    var arr = [];
    for(var i =999; i>100; i--){
        for(var j = 999; j>100; j--){
            var mul = j*i;
            if(isPalin(mul)){
                arr.push(j * i);
            }
        }
    }

    return Math.max.apply(Math, arr);
}

function isPalin(i){
    return i.toString() == i.toString().split("").reverse().join("");
}

console.log(largestPalindrome());

这是另一种方法,将3个数字生成的所有 palindrome 存储在一个数组中,然后使用 Math.max on the array 得到最大的 palindrome

原文由 Thalaivar 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为如果你将数学应用于问题,你可以真正显着减少猜测。

我将三位数写为 1000 - a1000 - b 这意味着回文是 1 000 000 - 1000(a+b) + ab

首先,让我们找到 ab < 1000 的解决方案。那么最左边的三个数字是 1000 - (a+b) 最右边的三个数字是 ab

然后我会说这是一个带数字的回文 x,y,z

 100x+10y+z=ab
100z+10y+x=1000-a-b

因此

99x-99z = ab+a+b-1000
x-z = 1/99(ab+a+b-10)-10

那么 (ab+a+b-10) 可以被 99 整除,我们也知道 x 和 z 是左边的数字,在 -9 和 0 之间(整个 shebang 是对称的,所以我们可以假设 x <= z)所以then 1/99(ab+a+b-10) is between 1 and 9. We can rewrite ab+a+b-10 as ab+a+b+1-11=99p so (a+1)(b+1)=99p+11=11*(9p+1) where p runs between 1 and 9. That’s really简单的:

 for ($p = 1; $p <= 9; $p++) {
  $n = 9 * $p + 1;
  // This could be vastly optimized further.
  for ($j = 1; $j <= $n; $j++) {
    if ($n % $j === 0) {
      $a = 1001 - $n / $j;
      $b = 1001 - 11 * $j;
      $test = $a * $b;
      if (strrev($test) === (string) $test) {
        print "$a $b " . $a * $b . "\n";
      }
    }
  }
}

现在这只打印一个正确的解决方案。

现在我们知道 906609 是一个解决方案,那么是否存在 ab > 1000 和 1000(a+b) - ab < 93391 的解决方案?那没有 :)

原文由 chx 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题