10

数値を複数の部分に分割して、部分の合計が入力数と等しくなるようにしようとしています。

3.99があり、2つの部分に分割する必要がある場合、期待される出力は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を出力でき、2番目の例では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

たとえば、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 に答える