Project Euler——最大的回文乘积

Project Euler -- Largest palindrome product

本文关键字:回文 Euler Project      更新时间:2023-09-26

这段代码似乎有问题,因为它没有检查最大的回文。我把它和他们展示的两位数的最大回文的例子混合在一起(由两个两位数的乘积制成的最大回文是9009=91×99),它起了作用。我环顾四周,但我仍然不明白为什么我的代码没有显示最终产品。如果有人愿意解释,而不仅仅是给出答案,这将非常有帮助

for(var i = 100; i < 1000; i++) {
  for(var j = 100; j < 1000; j++) {
    var total = String(i*j);
    var regularI = total.substring(0, Math.floor(total.length/2));
    var regularJ = total.substring(total.length/2,total.length);
    var reversedJ = regularJ.split("").reverse().join("");
    if(regularI === reversedJ) {
       console.log("SUCCESS'nTotal: " + (i*j) + "'nI: " + i + "'nJ: " + j);
    }
  }
}
993 * 913 = 906609
995 * 583 = 580085

假设乘法运算中的第一个数字对应于i,第二个对应于j。在带有i和j的嵌套for循环中,前一个乘法运算的结果将在后一个之前输出。如果您查看代码输出的末尾,就可以看到这一点。因此,输出的最终成功并不能保证是最大的回文。最大的回文可能出现在输出的早期。

解决这个问题的一个简单方法是保留在数组中找到的回文列表。嵌套的for循环完成后,您可以按数值对数组进行排序,并通过查看最后一个位置来获得最大的数字:

var palindromes = [];
for(var i = 100; i < 1000; i++) {
  for(var j = 100; j < 1000; j++) {
    var total = String(i*j);
    var regularI = total.substring(0, Math.floor(total.length/2));
    var regularJ = total.substring(total.length/2,total.length);
    var reversedJ = regularJ.split("").reverse().join("");
    if(regularI === reversedJ) {
      palindromes.push(Number(total));
    }
  }
}
// sorts the array in-place
// "default sort order is according to string Unicode code points" - Mozilla docs
// so we'll need to pass in a comparison function.
palindromes.sort(function(a, b) {
  return a - b;
});
console.log(palindromes[palindromes.length-1]);

如果你这样做,你会发现最大的回文确实是906609,这个数字在你的嵌套for循环中出现在倒数第三位(再次出现在前面)。

解决这个问题的另一种方法是专门使用一个变量,比如maxSoFar,来跟踪你见过的最高回文值。

还有其他方法可以解决这个问题,但我会让你自己去发现。