[英]Project Euler #32: Why is my answer wrong?
我正在处理问题 32 :
我做了一个(主要是)蛮力解决方案:
var main = function () {
var total = 0
for (var i = 0; i < 10000; i++) {
for (var j = i; j < 10000; j++) {
var temp = i * j;
var fullString = "" + i.toString() + j.toString() + temp.toString();
var allNums = fullString.split("").map(function(item) {
return parseInt(item, 10);
}).sort();
if (allNums.length == 9) {
var flag = 1
for (var k = 1; k <= 9; k++) {
if (allNums[k - 1] != k) {
flag = 0;
}
}
if (flag) {
total++;
}
}
}
}
return total;
}
console.log(main());
我认为被乘数、乘数和乘积具有 1 到 9 的唯一数字是一种非常罕见的情况。所以我的答案 9 对我来说似乎是合理的。 但是查看在线解决方案的实际答案是 45228。有人可以解释我在这里出错的地方吗?
非常感谢。
除了计算数字而不是求和之外,如问题中所暗示的:
有些产品可以通过多种方式获得,因此请确保在您的总和中只包含一次。
特别是,
18 * 297 = 5346
27 * 198 = 5346
它们都是 1 到 9 泛数字。
所以你需要记住你遇到的产品以避免重复:
var main = function () {
var total = 0
var seen = new Set();
for (var i = 0; i < 10000; i++) {
for (var j = i; j < 10000; j++) {
var temp = i * j;
var fullString = "" + i.toString() + j.toString() + temp.toString();
var allNums = fullString.split("").map(function(item) {
return parseInt(item, 10);
}).sort();
if (allNums.length == 9) {
var flag = 1
for (var k = 1; k <= 9; k++) {
if (allNums[k - 1] != k) {
flag = 0;
}
}
if (flag & !seen.has(temp)) {
total += temp;
seen.add(temp);
}
}
}
}
return total;
}
然后输出是 45228,就像预期的那样。
实际答案是 45228。但是,如果产品是重复的,我们会得到 56370。请检查一下:
function identityIs1to9Pandigital(multiplicand,multiplier,product)
{
var identity = `${multiplicand}${multiplier}${product}`.split('');
if(identity.indexOf('0')> -1)//if there's a zero in it, it cannot be pandigital
{return false;}
for(var i = 1; i <= 9; i++)//testing if number is 1 to 9 pandigital
{
var searchDigit = `${i}`;
var firstIndex = identity.indexOf(searchDigit);
var lastIndex = identity.lastIndexOf(searchDigit);
if(firstIndex !== lastIndex/*digit occurs more than once*/|| firstIndex < 0 || lastIndex < 0/*digit does not occur at all*/)
{
return false;
}
}
return true;
}
var sum = 0;
var pandigitalIdentities = [];//identities where multiplicand/multiplier/product are 1 to 9 pandigital
var pandigitalProducts = [];
for(var i = 1/*started from 1 since 1 to 9 pandigital cannot contain a 0*/; i < 10000; i++)
{
for(var j = 1; j < 10000; j++)
{
if(i > j)//if it's a duplicate identity(for example, if we've already computed 1 *2, then there's no need for 2 *1)
{}
else
{
var multiplicand = i;
var multiplier = j;
var product = multiplicand * multiplier;
if(identityIs1to9Pandigital(multiplicand,multiplier,product) && pandigitalProducts.indexOf(product) === -1)
{
sum+=product;
pandigitalProducts.push(product);
pandigitalIdentities.push(`multiplicand:${multiplicand},multiplier:${multiplier},product:${product}\n`);
}
}
}
}
console.log('sum: '+sum);
//print the pandigital identities
pandigitalIdentities.forEach(function(value, index, array)
{
console.log(value);
});
console.log 的结果如下所示:
sum: 45228
multiplicand:4,multiplier:1738,product:6952
multiplicand:4,multiplier:1963,product:7852
multiplicand:12,multiplier:483,product:5796
multiplicand:18,multiplier:297,product:5346
multiplicand:28,multiplier:157,product:4396
multiplicand:39,multiplier:186,product:7254
multiplicand:48,multiplier:159,product:7632
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.