高效算法,用于查找可被数字整除的数字计数,而不包含范围内的余数

时间:2016-10-12 04:52:55

标签: python algorithm performance

假设我有两个数字:6和11,我试图找出这个范围之间有多少数字可以被2整除(3,在这种情况下)。

我现在有这个简单的代码:

def get_count(a, b, m):
    count = 0

    for i in range(a, b + 1):
        if i % m == 0:
            count += 1

    return count

我相信它的增长顺序是线性的,O(N)。

我想知道是否存在具有恒定O(1)性能或数学公式的更快算法。

我不指望直接回答。这种算法的名称很棒。

谢谢。

3 个答案:

答案 0 :(得分:1)

((b - b%m) - a)//m+1似乎对我有用。我怀疑它有一个名字。另一个似乎有用的公式是(b//m) - ((a-1)//m)

示例python3程序:

def get_count(a, b, m):
    return (((b - (b % m)) - a) // m) + 1

for i in range(5, 8):
    for j in range(10, 13):
        print(get_count(i, j, 2), end=" ")
    print()

答案 1 :(得分:0)

你算数偶数。让我们写o为奇数,E为偶数。

如果序列具有偶数的数字,则为oEoE...oEEoEo...Eo,即一半数字始终为偶数。如果有奇数的数字,你可以分别检查第一个数字(或最后一个),其余的是先讨论的已知情况。

def count_even(start, end):
    # assert start <= end
    len = end - start
    len2, r = divmod(len, 2)
    if r and start % 2 == 0:
        len2 += 1
    return len2

答案 2 :(得分:-1)

查找0和n之间可被2整除的所有数字的计数。你可以使用称为右移的按位运算;

c = a >> 1;

10&gt;&gt; 1相当于floor(10/2)

您可以减去两个结果数字,并获得任意范围之间的数字。

这将在O(1)中起作用。希望这会有所帮助。