javascript - 欧拉计划 #5 效率和错误

标签 javascript

来自网站的问题:

2520 是可以被 1 到 10 中的每个数字整除而没有余数的最小数字。

能被 1 到 20 中所有数字整除的最小正数是多少?

<小时/>

我的问题

我有一个问题,涉及代码中的效率和错误。当我无法通过自己的方式通过时,我研究并查看了其他答案,但我仍然不明白这是如何实现的。另外,当我将代码插入 1-10 的 2520 时,我的代码显然无法工作。

请注意,我想要有关效率的答案或解决方案,只是解释我如何实现它(又名提示)。但对于我的代码中的错误,我想要一个解决方案。预先感谢您的帮助!

var recentArray = [];
var fullArray = [];
var numberCheck = 20;

function makeNewNumbers(i1, i2) {

    for (var i = i1; i < i2; i++) {
        recentArray = [];
        for (var j = 2; j <= numberCheck; j++) {
            recentArray.push(i % j);
        }
        fullArray.push(recentArray);
    }
}

var counter = 0;
var iStart = 0,
    iLess = 1000;
var success = false;

var newCheck = setInterval(function () {
    while (counter < 10 && success === false) {
        counter++;
        makeNewNumbers(iStart, iLess);
        for (var o = 1; o < fullArray.length; o++) {
            recentFound = false;
            if (numberCheck === 20 && fullArray[o][0] === 0 && fullArray[o][1] === 0 && fullArray[o][2] === 0 && fullArray[o][3] === 0 && fullArray[o][4] === 0 && fullArray[o][5] === 0 && fullArray[o][6] === 0 && fullArray[o][7] === 0 && fullArray[o][8] === 0 && fullArray[o][9] === 0 && fullArray[o][10] === 0 && fullArray[o][11] === 0 && fullArray[o][12] === 0 && fullArray[o][13] === 0 && fullArray[o][14] === 0 && fullArray[o][15] === 0 && fullArray[o][16] === 0 && fullArray[o][17] === 0 && fullArray[o][18] === 0) {
                clearInterval(newCheck);
                console.log("Success!!! Number: " + o);
                success = true;
                break;
            } else if (numberCheck === 10 && fullArray[o][0] === 0 && fullArray[o][1] === 0 && fullArray[o][2] === 0 && fullArray[o][3] === 0 && fullArray[o][4] === 0 && fullArray[o][5] === 0 && fullArray[o][6] === 0 && fullArray[o][7] === 0 && fullArray[o][8] === 0) {
                clearInterval(newCheck);
                console.log("Success!!! Number: " + o);
                success = true;
                break;
            }
        }
    }
    iStart += 1000;
    iLess += 1000;
    console.log("Not found...\nSearch is continued. To postpone type \'clearInterval(newCheck)\'\nNerd stats: --- Starting minimum: " + iStart + " --- Starting maximum: " + iLess);
}, 1);

最佳答案

使用数学,而不是暴力。

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

从数学上讲,这称为 least common multiple共 1, ..., 20 个。

计算两个数字的最小公倍数的一种非常快速的方法是使用 Euclidean algorithm计算 greatest common divisor .

function gcd(a, b) { // Greatest common divisor
  if(b == 0) return a;
  return gcd(b, a%b);
}
function lcm(a, b) { // Least common multiple
  return a * b / gcd(a, b);
}
var n = 1;
for(var i=1; i<=20; ++i) n = lcm(n, i);
n; // 232792560

关于javascript - 欧拉计划 #5 效率和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702110/

相关文章:

javascript - 这个页面说 NaN

javascript - Azure 移动服务 : Get Server DateTime and compare it

javascript - 在 Typescript 中导入 CouchDB Nano 6.4 打字

javascript - Windows路径的javascript中 "../"的含义是什么?

javascript - 不同格式的相同日期返回不同的值

javascript - 计算当前坐标和坐标列表之间的距离

javascript - 选择文本输入时强制显示键盘

javascript - 从字符串中获取第 n 个元素

Javascript - 根据单击的按钮的 ID 创建开关盒

php - 获取事件网卡的网站访问者 MAC 地址?