Project Euler——最大的回文乘积
Project Euler -- Largest palindrome product
这段代码似乎有问题,因为它没有检查最大的回文。我把它和他们展示的两位数的最大回文的例子混合在一起(由两个两位数的乘积制成的最大回文是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
,来跟踪你见过的最高回文值。
还有其他方法可以解决这个问题,但我会让你自己去发现。
相关文章:
- Javascript回文逻辑
- 如何创建一个函数来检查日期是否为回文
- 如何检查字符串是否为回文JavaScript〔CLOSED!〕
- 用于回文变位的JavaScript解决方案
- 我在javascript中遇到了一个回文函数的问题
- 用分裂和反转的逻辑理解回文代码
- 一根绳子可以有回文吗,有没有更好的方法可以做到这一点
- 回文程序 - 意外的标识符错误
- 如何创建一个接受输入的函数并测试它是否是回文
- JavaScript 检查回文(包括空格和标点符号)
- 更高效的回文代码
- Javascript中最大的回文产品
- 如何在JavaScript中回文这个字符串
- 检查字符串数组中的回文的运行时
- 替换非字母数字字符以使用 javascript 检查回文
- 我该如何修复这个回文检查器
- 为回文函数调试 JavaScript
- 字符串中最长的回文
- JavaScript回文测试失败
- Project Euler——最大的回文乘积