我创建了一个算法,用于查找范围内可被第三个数字k整除的数字。我得到了它,但在多项式时间而不是线性时间
function divisibleCount(x, y, k) {
var count = 0;
for (var i = x; i <= y; i++) {
if (i % k === 0) {
count++;
}
return count;
}
参数如下
x: Start of range
y: End of range
K: Number is divisible by
问题肯定是for循环,这使得这个多项式时间。
我试图使用
for (var i = x; i <= k; i += k)
但得到了错误的答案。
有什么方法可以改善这个吗?
答案 0 :(得分:6)
O(1)。
这样的事情:
Math.floor((y-1) / k) - Math.floor((x-1) / k)
说明:
Math.floor((x-1)/ k)是在间隔之前被k整除的数字的数量。
Math.floor((y-1)/ k)是可以被k整除的数字,直到间隔结束。
正确的数字和k&gt; 0.希望;)
编辑: 我明白了,你想在范围中加入y。好的,然后改为:
Math.floor(y / k) - Math.floor((x-1) / k)
这是作业吗?我感到有点内疚。