三个整数按比例缩放取整总和对齐问题:如何实现分配后总和为128
整数按比例分配总和对齐解法
适用方案:最大余数法(汉密尔顿分配法)
该方案全程使用整数运算,无浮点数精度问题,也不需要硬编码补差值,完全满足需求。
核心逻辑
- 先计算所有原始数值的总求和
- 对每个数值,用整数除法计算
(数值 * 目标总和) // 总求和得到基础分配值,同时取模得到对应的余数 - 计算基础分配值总和和目标总和的差值
diff - 将所有数值按余数从大到小排序,前
diff个数值的基础分配值各加1,最终总和就会完全对齐目标值
代码实现
def proportional_allocate(values, target_sum): total = sum(values) base = [] remainders = [] for v in values: product = v * target_sum base.append(product // total) remainders.append(product % total) diff = target_sum - sum(base) # 按余数倒序取对应索引 sorted_idx = sorted(range(len(values)), key=lambda x: -remainders[x]) for i in sorted_idx[:diff]: base[i] += 1 return base # 调用测试 a, b, c = 1541, 1575, 1512 res = proportional_allocate([a, b, c], 128) print(res) # 输出 [43, 43, 42] print(sum(res)) # 输出 128
场景计算验证
- 原始总求和:
1541 + 1575 + 1512 = 4628 - 基础分配值:分别为
1541*128//4628=42、1575*128//4628=43、1512*128//4628=41,总和为126,差值为2 - 余数计算:三个数对应的余数分别为2872、2596、3788,按倒序排序后前两位对应c和a
- 给c和a的基础值各加1,最终结果为43、43、42,总和刚好为128
内容的提问来源于stack exchange,提问作者kadir_cakir
相关产品推荐
相关产品推荐

