项目欧拉 - 最大的回文产品

时间:2015-11-11 00:06:08

标签: javascript

此代码似乎存在问题,因为它没有检查最大的回文。我将它与他们显示的最大回文的例子从两位数字混合(由两个2位数字的乘积制成的最大回文是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);
    }
  }
}

1 个答案:

答案 0 :(得分:4)

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)用于跟踪你所见过的最高回文值。

还有其他方法可以解决这个问题,但我会留给你发现。