如何将整数分割为和为原值、近似均等且分布均匀的数组?
整数均匀分割算法实现
要实现将整数n分割为d个满足要求的数组元素,核心是保证元素大小差异最小且分布均匀,具体算法如下:
核心逻辑
- 计算基础值:
base = n // d,这是每个元素的最小取值; - 计算余数:
extra = n % d,这代表有extra个元素需要比基础值大1(即base + 1),所有元素总和刚好等于n; - 将这
extra个base + 1均匀分散在数组中,避免集中堆积。
具体实现(Python示例)
def split_uniformly(n, d): if d == 0: raise ValueError("分割份数不能为0") base = n // d extra = n % d result = [base] * d if extra == 0: return result # 计算大元素的间隔,保证均匀分布 step = d // extra current_idx = step - 1 # 第一个大元素的位置 for _ in range(extra): result[current_idx] += 1 current_idx += step # 处理d无法被extra整除的边界情况 if current_idx >= d: current_idx = d - 1 return result
验证示例
当n=13,d=10时:
base=1,extra=3,step=10//3=3- 大元素的位置为
2、5、8,最终数组为[1, 1, 2, 1, 1, 2, 1, 1, 2, 1],完全符合要求。
为什么满足要求
- 总和正确:
(d - extra)*base + extra*(base+1) = d*base + extra = n,与原整数相等; - 大小近似均等:所有元素仅为
base或base+1,最大差值为1,不会出现悬殊过大的元素; - 分布均匀:通过计算间隔
step,将extra个大元素均匀分散在数组中,避免集中在某一段。
内容的提问来源于stack exchange,提问作者Tim Angus
相关产品推荐
相关产品推荐

