如何将数字分成多个部分,使得结果总和等于输入?

我试图将一个数字分成多个部分,因此该部分的总和等于输入数字。

如果我有3.99并且我需要分成两部分,预期输出为2和1.99(2 + 1.99 = 3.99)

如果我需要将3.99分成3个部分,预期输出为1.3,1.3和1.39(1.3 + 1.3 + 1.39 = 3.99)

我能够输出2.99和1作为第一个例子,我能够得到1.99,1和1为第二个例子。 但是,在这两种情况下,结果与预期产出相差甚远。

我需要将邮寄费用分成不同的订单项。 结果可以等分或不等分,同时确保不同部分的总和等于输入数。

以下是其他一些例子:

3.99 divided in 3 parts: 1.33, 1.33, 1.33 3.98 divided in 3 parts: 1.33, 1.33, 1.32 3.97 divided in 3 parts: 1.32, 1.32, 1.33 3.96 divided in 3 parts: 1.32, 1.32, 1.32 3.95 divided in 3 parts: 1.32, 1.32, 1.31 

我测试了你提供的值。 可能需要一些调整:

 static IEnumerable SplitValue2(decimal value, int count) { if (count <= 0) throw new ArgumentException("count must be greater than zero.", "count"); var result = new decimal[count]; decimal runningTotal = 0M; for (int i = 0; i < count; i++) { var remainder = value - runningTotal; var share = remainder > 0M ? Math.Max(Math.Round(remainder / ((decimal)(count - i)), 2), .01M) : 0M; result[i] = share; runningTotal += share; } if (runningTotal < value) result[count - 1] += value - runningTotal; return result; } 

这假设您传入一个2位小数精度的值。 如果你传入3.999,你将无法获得正确的结果。

如果有人打算使用扩展方法拆分舍入数字,可以通过执行以下操作来完成。 例如。 将25分成4会产生像6,6,6,7这样的结果。 谢谢@ Jon B.

  public static IEnumerable PartitionMeInto(this int value, int count) { if (count <= 0) throw new ArgumentException("count must be greater than zero.", "count"); var result = new int[count]; int runningTotal = 0; for (int i = 0; i < count; i++) { var remainder = value - runningTotal; var share = remainder > 0 ? remainder / (count - i) : 0; result[i] = share; runningTotal += share; } if (runningTotal < value) result[count - 1] += value - runningTotal; return result; } 

用法

  int value = 25; var result = value.PartitionMeInto(4); 

我有一个要求,其中ex:29的数字被分成一个常数数组,其余部分必须在最后添加。

29 = 9,9,9,3。 为此我的代码是。

  List split(int num,int splitBy) { List r = new List(); int v = Convert.ToInt32(num / splitBy); r.AddRange(Enumerable.Repeat(splitBy, v).ToArray()); var remaining = num % splitBy; if (remaining != 0) r.Add(remaining); return r; } 

快乐的编码!