2011-02-15 94 views
2

我需要得到一个数字的平均值,但不是以小数形式,我需要它在“公平”的整数形式。我不知道这是不是最好的解释方法,所以这里有一些例子。“公平”整数平均

例子:

51/4 = 12.75 

但我需要的线沿线的东西更多:

51/4 = 13,13,13,12 

任何建议,将不胜感激。

+0

在后面的符号中常见的是哪些字段?我从来没有见过它,但我觉得它奇怪有趣。 – 2011-02-15 15:19:37

回答

3

在伪码:

int base = floor(dividend/divisor); 
int with_one_more = dividend MOD divisor; 

其结果将是with_one_more条目等于base+1,和divisor-with_one_more条目是base。在你的例子中,dividend = 51,divisor = 4。这使得base = 12和with_one_more = 3。

2

那么,对于x/y,这将是一个包含数量(x div y)+ 1的列表,通常为(x mod y)次,并且它包含的数字(x div y)与y - (x mod y)次。

1

正如我理解你的“公平整数形式”的定义,算法来解决这一问题可以采取以下形式:

  1. 确定数量的理性表达(即p/q一些pq,如果它还没有以这种形式出现的话)。
  2. 可选地将其缩小为最简化的形式(这将生成尽可能最短的输出,尽管省略此步骤仍然会生成“公平”列表)
  3. 将此表达式拆分为整数和剩余的小数部分 - 如此你的51/4案例你有123/4。拨打这些号码np/q
  4. 输出q数字,其中第一个pn + 1,其余的是n
7

首先使用编程整数除法,然后使用模数找到余数。 这里是一个例子:

依靠整数除法摧毁你的余数。

99/5 = 19

然后用模找到其余

99 % 5 = 4 

然后增加四个数字...

20 20 20 20 19 
1

如果51/4返回四舍五入整数值的清单,在这种情况下12,你知道值12和13之间下降,从而采取51模数13 12 。

x/y = z 
x mod (z + 1) = w 

您的号码是(Y - 1)次Z和W,例如:

63/4 = 15 
63 mod (15 + 1) = 15 

这样的数字是(4 - 1)乘16和15:16,16,16,15.