所以基本上,有多種情況需要通過計算在給定范圍 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
我的解釋很糟糕,但我不知道如何使它更清楚。我希望有人能理解并啟發我解決這個問題。謝謝
uj5u.com熱心網友回復:
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
你也應該像這樣結合@mozway's和我的回答。
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)}")
應要求編輯:該*運算子在上面使用了兩次以從可迭代物件中解壓縮元素。例如,在上面的陳述句中,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
uj5u.com熱心網友回復:
您不需要遍歷所有值。您只能從最小的起點 ( (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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381476.html
下一篇:回圈時將欄位和值添加到陣列?
