假设我有两个数字: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)性能或数学公式的更快算法。
我不指望直接回答。这种算法的名称很棒。
谢谢。
答案 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...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
答案 2 :(得分:-1)
查找0和n之间可被2整除的所有数字的计数。你可以使用称为右移的按位运算;
c = a >> 1;
10&gt;&gt; 1相当于floor(10/2)
您可以减去两个结果数字,并获得任意范围之间的数字。
这将在O(1)中起作用。希望这会有所帮助。