繁体   English   中英

高效的算法,可找到可被数字整除的数的计数,而该数没有范围内的余数

[英]Efficient algorithm to find the count of numbers that are divisible by a number without a remainder in a range

假设我有两个数字: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)性能或数学公式。

我不希望直接回答。 这样的算法的名字真是棒极了。

谢谢。

((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()

您正在计算偶数。 让我们写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

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

c = a >> 1;

10 >> 1等于floor(10/2)

您可以将两个结果数字相减得到任意范围之间的数字。

这将在O(1)中起作用。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM