讓我們假設我有一個數字100,我需要將其分成 N 個部分,每個部分最初不應超過 30。所以最初的分組是 (30,30,30)。余數(即 10)將通過向每組連續添加 2 來分配到這三個組中,從而確保每組是 2 的倍數。因此,所需的輸出應類似于 (34,34,32)。
注意:原始數字始終為偶數。
我嘗試用 Python 解決這個問題,這就是我想出的。顯然,它并沒有像我想象的那樣作業。它通過向每個組迭代添加 1(而不是 2,根據需要)來分配剩余部分。
num = 100
parts = num//30 #Number of parts into which 'num' is to be divided
def split(a, b):
result = ([a//b 1] * (a%b) [a//b] * (b - a%b))
return(result)
print(split(num, parts))
輸出:
[34, 33, 33]
期望的輸出:
[34, 34, 32]
uj5u.com熱心網友回復:
簡化問題:忘記 2 的倍數
首先,讓我們簡化一下您的問題。忘掉 2 的倍數吧。想象一下,你想把一個非偶數分割n成k非偶數部分。
顯然,最平衡的解決方案是讓一些部分成為n // k,一些部分成為n // k 1。
其中有多少?讓我們用 來呼叫r零件的數量n // k 1。然后是k - r帶有n // k的部分,所有部分的總和為:
(n // k) * (k - r) (n // k 1) * r
== (n // k) * (k - r) (n // k) * r r
== (n // k) * (k - r r) r
== (n // k) * k r
但是這些部分應該總結為n,所以我們需要找到r這樣的:
n == (n // k) * k r
令人高興的是,您可能會在這里認出歐幾里得除法,n // k即商和r余數。
這給了我們我們的split功能:
def split(n, k):
d,r = divmod(n, k)
return [d 1]*r [d]*(k-r)
測驗:
print( split(50, 3) )
# [17, 17, 16]
拆分為 2 的倍數
現在回到你的split_even問題。現在我們有了泛型函式split,一個簡單的解決方法split_even是使用split:
def split_even(n, k):
return [2 * x for x in split(n // 2, k)]
測驗:
print( split_even(100, 3) )
# [34, 34, 32]
概括:的倍數 m
用m2 以外的數的倍數做同樣的事情是微不足道的:
def split_multiples(n, k, m=2):
return [m * x for x in split(n // m, k)]
測驗:
print( split_multiples(102, 4, 3) )
# [27, 27, 24, 24]
uj5u.com熱心網友回復:
此解決方案不是很清楚且易于遵循,但它不需要任何回圈。
完整代碼:
def split(a,b):
lower = (a//b//2) * 2
num = a % (b*2) // 2
return [lower 2] * num [lower] * (b - num)
解釋:
- 首先獲取所有部分的值:我們將除法的結果 (
value // parts) 向下舍入到下一個偶數 ((x // 2) * 2) - 為了獲得更高值的數量:我們使用除法的余數,
a將其除以二以補償乘法 - 最后:較高的數字只是
lower 2計算出的較高值的數量的倍數,較低的數字填充其他空間
uj5u.com熱心網友回復:
我的方法是創建三個陣列并將它們求和,前兩個很簡單,但最后一個要遵循更復雜一些 - 它只是重復 2 (by) 盡可能多的余數,然后重復 0。
# Part 1
np.repeat(first, x//first)
# Part 2
np.repeat(by, x//first)
# Part 3
np.repeat([by, 0], [(x//first) - ((x - (x//first*first)) // by % by), (x - (x//first*first)) // by % by])
封裝成一個函式:
def split(x, first, by):
return(np.repeat(first, x//first) np.repeat(by, x//first) np.repeat([by, 0], [(x//first) - ((x - (x//first*first)) // by % by), (x - (x//first*first)) // by % by]))
split(100, 30, 2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/384823.html
