【问题标题】:Algo for dividing a number into (almost) equal whole numbers将一个数字分成(几乎)相等的整数的算法
【发布时间】:2013-12-03 10:34:20
【问题描述】:

我的情况是,我收到的发票电子表格包含跨越多个月的单行,其中一个数量列包含所有月份的数量总和。

为了逐月运行分析,我们需要将总量分成 n 行的相等(ish)数量,其中 n 是跨越的月数。

这些数字可以相差一到两个,但每个元素之间的差异越小越好。

我在 python 中做了一个粗略的模型,但我觉得有更好的方法可以做到这一点。注意:请原谅...一切:

from __future__ import division
import math
def evenDivide(num, div):
    splits = []
    sNum = str(num/div)
    remainder = float(sNum[sNum.index('.'):])
    #print "Remainder is " + str(remainder)
    integer = math.floor(num/div)
    #print "Integer is " + str(integer)
    totRemainder = round(remainder * div, 2)
    #print "Total Remainder is " + str(totRemainder)
    for index in range(div):
        if (totRemainder > 0):
            totRemainder -= 1 if (index%2 == 0) else 0
            if (index % 2 == 0):
                splits.append(int(integer + 1)) 
            else:
                splits.append(int(integer))
        else:
            splits.append(int(integer))
    for index in range(div):
        if(totRemainder > 0):
            if (index % 2 == 1):
                splits[index] += 1
                totRemainder -= 1

    return splits

def EvalSolution(splits):
    total = 0
    for index in range(len(splits)):
        total += splits[index]
    return total

def testEvenDivide():
    for index in range(20000):
        for jndex in range(3, 200):
            if (EvalSolution(evenDivide(index, jndex)) != index):
                print "Error for " + str(index) + ", " + str(jndex)

【问题讨论】:

  • 到底是什么问题?你的代码做你想做的事吗?在这种情况下,您应该在codereview.stackexchange.com 上发帖
  • 你能举出输入/输出的例子吗?

标签: python algorithm math division


【解决方案1】:

如果空间是个问题,这条单线可能会有所帮助:

num, div = 15, 4
print ([num // div + (1 if x < num % div else 0)  for x in range (div)])
# result: [4, 4, 4, 3]

【讨论】:

  • 1) [num // div for x in range (div)] 创建一个所有等于 num/div 的 div 编号列表,即 [3,3,3 ,3]; 2) (1 if x 仅将 1 添加到第一个 num%div 元素,即 [1,1,1,0] 组合给出了答案 [4,4, 4,3]
【解决方案2】:

我假设 num 和 div 都是整数(你应该在你的问题中提到它)。

您可以使用模运算符来查找除法的余数:

remainder=num%div   # i.e. 124/12 will give you 4

整数除法会给你结果的整数部分而不使用 math.floor

integer = num/div    # i.e. 124/12 will give you 10

我现在将返回 (integer,remainder) 元组,但如果您真的需要列表中的所有拆分,您可以这样做:

splits=[]
for i in range(div):
   splits.append(integer)
for i in range(remainder):
   splits[i]+=1

【讨论】:

  • 顺便说一句,Python 有一个名为 divmod() 的内置函数,这对于做第一部分很有用。
【解决方案3】:

这一班轮可以提供帮助:

def get_evenly_divided_values(value_to_be_distributed, times):
    return [value_to_be_distributed // times + int(x < value_to_be_distributed % times) for x in range(times)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2011-02-09
    相关资源
    最近更新 更多