繁体   English   中英

Project Euler #32:为什么我的答案是错误的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM