我有一个算法,用于整数x
和一个起始整数i
,使得1< i
< x
i
的下一个值由i = floor(x / i) + (x mod i)
计算。这一直持续到我们已经看到的i
为止。
在JavaScript中(虽然这个问题与语言无关):
function f(x, i) {
var map = {};
while(!map[i]) {
map[i] = true;
i = Math.floor(x / i) + (x % i); // ~~(x / i) is a faster way of flooring
}
return i;
}
我可以证明我们最终会到达i
我们已经看过的人,但我想知道:
i
?i
而没有经过循环n
次?只是为了澄清 - 我知道有更快的方法比使用JS哈希映射进行检查,并且该地板可以用其他语言的整数除法代替。我已经完成了这两个优化,但我把它们排除在外,试图让代码更容易理解。抱歉有任何困惑。
提前致谢!
答案 0 :(得分:3)
我认为主要的时间吃 - 地图。它使用一些散列函数(可能不简单)。如果i
范围受到合理值的限制,最好使用位/布尔数组(或Javascript模拟)
第二个 - 两个部门。 Javascript中浮点数和整数是否明显不同?可以进行一次整数除法,找到带乘法和减法的模数(由于整数除法/模数定义的基本属性):
p = x \\ i
i = p + (x - p * i)
or
i = x - (x \\ i) * (i - 1)
注意:大多数处理器中的整数除法同时计算商和残差
mov eax, 17 //dividend
mov ecx, 3 //divisor
xor edx, edx //zero
div ecx //edx:eax pair divide by ecx
//now eax contains quotient 5, edx contains residue (modulus) 2
如果你可以在C中使用asm,或者有一些像delphi DivMod这样的函数,你可以更快地进行计算。