[英]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...oE
或EoEo...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.