繁体   English   中英

Project Euler #43:为什么我的答案需要这么长时间?

[英]Project Euler #43: Why does my answer take so long?

我正在解决问题 43

我已经做了一个蛮力解决方案。 但它应该在 O(n) 时间内执行。

在我的电脑上需要几个小时才能完成。 我可以做些什么来加快计算复杂度?


const main = () => {
    let total = 0;
    for (let i = 1023456789; i < 9876543211; i++) {
    // for (let i = 1406357289; i < 1406357290; i++) {
        if (isPandigital(i)) {
            var d = i.toString().split("");
            if (checkSubString (d[1], d[2], d[3], 2) &&
                checkSubString (d[2], d[3], d[4], 3) &&
                checkSubString (d[3], d[4], d[5], 5) &&
                checkSubString (d[4], d[5], d[6], 7) &&
                checkSubString (d[5], d[6], d[7], 11) &&
                checkSubString (d[6], d[7], d[8], 13) &&
                checkSubString (d[7], d[8], d[9], 17)) {
                total += i;
            }
        }
    }
    return total;
};

const checkSubString = (d1, d2, d3, prime) => parseInt(`${d1}${d2}${d3}`) % prime === 0;

const isPandigital = num => {
    var allNums = num.toString().split("").map(item => parseInt(item, 10)).sort();
    for (var k = 0; k < allNums.length; k++) {
        if (allNums[k] !== k) {
            return false;
        }
    }
    return true;
}

console.log(main()); // 16695334890

与其迭代范围内的所有数字,不如只生成导致泛数字数字的排列,然后迭代它们呢? 这将减少很多计算:

这个答案中调整置换函数:

 const checkSubString = (d1, d2, d3, prime) => `${d1}${d2}${d3}` % prime === 0; const main = () => { let total = 0; const pandigitalNumbers = permut('1234567890').filter(char => char[0] !== '0'); for (const i of pandigitalNumbers) { var d = [...String(i)]; if (checkSubString(d[1], d[2], d[3], 2) && checkSubString(d[2], d[3], d[4], 3) && checkSubString(d[3], d[4], d[5], 5) && checkSubString(d[4], d[5], d[6], 7) && checkSubString(d[5], d[6], d[7], 11) && checkSubString(d[6], d[7], d[8], 13) && checkSubString(d[7], d[8], d[9], 17)) { total += Number(i); } } return total; }; console.log(main()); function permut(string) { const arr = []; if (string.length < 2) return string; for (let i = 0; i < string.length; i++) { const char = string[i]; if (!string.includes(char)) continue; const remainingString = string.slice(0, i) + string.slice(i + 1, string.length); for (var subPermutation of permut(remainingString)) arr.push(char + subPermutation) } return arr; }

上面的代码片段在我的机器上运行大约 4 秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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