在JavaScript中,我如何在循环中高效地处理大数?

4

我的指令是“对于i从1到n,执行i%m并返回总和。 由于n可能非常大,因此您需要在性能方面变得聪明一些”。

下面的程序对小数字有效。如何使它在处理大数字时更加高效?

function f(n, m) {
    var summ = 0;

    for (var i = 1; i <= n; i++) {
        summ += i % m;
    }

    return summ;
}

8
因为这听起来像是作业,我会给你一个提示,看看你能不能想出接下来该做什么。在你的for循环内加入console.log(i % m),并查看当n的值至少是m的5倍时它显示的内容。这是一个演示:http://jsfiddle.net/jfriend00/hjhjyrbe/。 - jfriend00
2
我同意@jfriend00的观点,但我会给你一个提示:解决这个问题并不需要使用for循环。 - Scelesto
@jfriend00 实际上这是在codewars.com上的一个任务,所以你提供的帮助正是我想要的。不幸的是,它可以处理小数字但无法处理大数字:https://jsfiddle.net/q1g8g6w2/ - Wilfredo
@user3696359:实际上我们根本没说要使用循环 :-) - Bergi
@Bergi,哈哈,是的。我的第二次尝试只基于jfriend00的评论,因为我还没有阅读scelesto的建议。 - Wilfredo
1个回答

0

为了了解发生了什么,请考虑部分和,首先计算从0到m-1的总和,然后计算从m到2m-1,2m到3m-1等的总和。

m=5;
for(j=0;j<5;++j) {
    partial = 0;
    for(i=j*5;i<j*5+5;++i) {
        partial += i % m;
        console.log( i , partial );
    }
}

如果想让代码变得简洁,可以看一下三角形数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接