对于python中的多种情况(C),如何计算给定范围(A到B)内可被N整除的数字

how to count the number divisible by N in given range (A to B) for multiple cases (C) in python

所以基本上,有多种情况需要通过计算给定范围 A 到 B 中可被 N 整除的数字来解决。

例如有2种情况

案例 1 有 A=1,B=10,N=3

案例 2 有 A=8,B=20,N=4

但在一个条件下输入必须是这样的:

2        #<-- number of cases
1        #<-- A 
10       #<-- B 
3        #<-- N
8        #<-- A
20       #<-- B
4        #<-- N

输出如下:

Case 1: 3 #because between 1 until 10, only 3,6,9 that divisible by 3
Case 2: 4 #because between 8 until 20, only 8,12,16,20 that divisible by 4

我有这个功能供参考:

def CountDiv(A,B,N):
    count = 0
    
    for i in range(A, B+1):
        if i % N == 0:
            count = count + 1
    
    return count

我的解释很糟糕,但我只是不知道如何让它更清楚。我希望有人能理解并启发我解决这个问题。谢谢

CountDiv 函数有效。所以,我假设您在询问如何正确分割输入列表。如果您的输入序列在列表中,这应该有效

seq = [ 2,        #<-- number of cases
        1,        #<-- A 
        10,       #<-- B 
        3,        #<-- N
        8,        #<-- A
        20,       #<-- B
        4,        #<-- N
]


def slices(lst, n):

    number_of_cases = lst.pop(0)
    
    for i in range(0, n * number_of_cases, n):
        yield lst[i:i + n]


def CountDiv(A,B,N):
    
    count = 0
    for i in range(A, B+1):
        if i % N == 0:
            count = count + 1
    
    return count

print([CountDiv(*sub) for sub in [*slices(seq, n=3)]])
# [3, 4]

如果你想要你描述的准确输出,你可以这样做

for idx, sub in enumerate([*slices(seq, n=3)]):
    print(f"Case {idx}: {CountDiv(*sub)}")

# Case 0: 3
# Case 1: 4

你也应该把和我的回答结合起来,像这样。

def slices(lst, n):
   
    number_of_cases = lst.pop(0)
     
    for i in range(0, n * number_of_cases, n):
        yield lst[i:i + n]

def ndiv(A, B, N):
    return (B+N-(A+N-1)//N*N)//N if B>=A else 0

for idx, sub in enumerate([*slices(seq, n=3)]):
    print(f"Case {idx}: {ndiv(*sub)}")

根据要求编辑* 运算符在 unpack elements from an iterable 上面使用了两次。例如,在上面的语句中,ndiv(*sub) 可以替换为 ndiv(sub[0], sub[1], sub[2])。如果我们想让它变得非常冗长,我们可以这样写

result_of_slicing = list(slices(seq, n= 3))
# [[1, 10, 3], [8, 20, 4]]

for index, a_slice in enumerate(result_of_slicing):

    A, B, N = a_slice
    result_of_ndiv = ndiv(A=A, B=B, N=N)
    
    print(f"Case {index}: {result_of_ndiv}")
    # Case 0: 3
    # Case 1: 4

您不需要遍历所有值。您只能从最小的起点((A+N-1)//N*N)生成倍数:

def ndiv(A, B, N):
    return len(list((A+N-1)//N*N, B+1, N)))

更好的是,使用以下方法直接计算值的数量:

def ndiv(A, B, N):
    if B<A:
        return 0
    return (B+N-(A+N-1)//N*N)//N

示例:

>>> ndiv(8,20,4)
4

>>> ndiv(1,10,3)
3

>>> ndiv(1,1,3)
0