对于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
所以基本上,有多种情况需要通过计算给定范围 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