10

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

如果我有 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
4

3 回答 3

6

我用您提供的值进行了测试。可能需要一些调整:

static IEnumerable<decimal> 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,你将不会得到正确的结果。

于 2012-11-27T13:59:06.367 回答
3

如果有人打算使用扩展方法拆分四舍五入的数字,可以通过执行以下操作来完成。例如。将 25 分成 4 会得到类似 6,6,6,7 的结果。谢谢@乔恩 B

 public static IEnumerable<int> 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);
于 2015-01-09T03:34:59.457 回答
2

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

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

       List<int> split(int num,int splitBy)
           {

               List<int> r = new List<int>();
               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;

           }

快乐编码!!!

于 2016-05-19T09:07:23.097 回答