【发布时间】:2019-01-15 19:07:15
【问题描述】:
我正在尝试在 JS 中实现 2 个数学函数,但是我还需要调用 S(10**11) % 10**9,这需要很长时间。这些函数基于我拥有的 2 个数学函数:
我试着把它写到我的计算器(ti nspire)中,但是它没有足够的内存,这就是我写这个脚本的原因。
除了我已经完成的或可能解决求和之外,我真的不确定如何优化它,但我不确定如何使用 floor 函数来做到这一点。
function d(k){
var a = 0;
for(l=1;l<=k;l++){
a += Math.floor(1/(1+k%l))*l;
}
return a;
}
function S(N){
var a = 0;
for(i=1;i<=N;i++){
for(j=1;j<=N;j++){
a += d(i*j);
}
}
return a;
}
【问题讨论】:
-
10**11 * 2是一个非常大的数字,你不能只是暴力迭代。 -
嗯
d(2 * 3)和d(3 * 2)一样对吧?所以S中的第二个总和只需转到i,然后将结果加倍。 -
不确定这是否有帮助,但可以在 JS 中使用 GPU 加速数学,.. 看看这里 -> gpu.rocks
-
这听起来像是一个典型的竞争性编程问题。如果是这种情况,那么您不应该尝试暴力解决方案。它几乎从不工作。您应该了解这个问题背后的逻辑(在这种情况下是数学)并找出如何大大简化它。即使这不是一个竞争性编程问题,也请查看
d(k)并尝试了解它的真正作用以及您是否可以更有效地在逻辑上计算相同的值。然后看看你是否可以更有效地计算d(i*j)(而不是仅仅d(x))。作为第一个提示:当Math.floor(1/(1+k%l))不是0? -
@SergGr 函数
d(k)返回k 的因子之和,是我为它创建的函数。查找因素总和的其他解决方案,我找到了this,但是我不确定如何实现它。 S(N) 是我得到的一个函数。
标签: javascript math calculus