稍微說點錢的事吧 - 分錢的方法 (2)

  • 2405
  • 0
  • C#
  • 2012-09-10

稍微說點錢的事吧 - 分錢的方法 (2)

上次分錢時提到合理性的問題,分贓不公平可是人命關天的。

為什麼會說上次的作法不公平呢? 讓我們寫點程式碼,設計一道題目並把結果Print出來。

題目是上次就有提到的,三個持有20%股份和一個持有40%股份的人,去分1元的獲利,最小單位為1元。

 

static void Main(string[] args)
{
    // 三個持有20%股份和一個持有40%股份的人,分1元的獲利
    decimal[] factors = { 40, 20, 20, 20 };
    decimal momey = 1;
    BaseDivider divider = new MyDivider1();
    decimal[] results = divider.Divide(factors, momey, 0);
    // 印出結果
    Console.WriteLine("MyDivider1");
    printResult(factors, results, 1);
    Console.ReadKey();
}

static void printResult(decimal[] factors, decimal[] values, decimal totalValue)
{
    decimal fSum = factors.Sum();
    decimal vUnit = totalValue / factors.Sum();
    decimal diff2Sum = 0;
    decimal valueSum = 0;
    Console.WriteLine("\t{0}\t{1}\t{2}", "factor", "value", "Diff.");
    for (int i = 0; i < factors.Length; i++)
    {
        decimal _diff = values[i] - factors[i] * vUnit;
        diff2Sum += _diff * _diff;
        valueSum += values[i];
        Console.WriteLine("{0}\t{1}\t{2}\t{3:N4}",
            i, factors[i], values[i], _diff);
    }
    Console.WriteLine();
    Console.WriteLine("SUM:\t{0}\t{1}\t{2}\t{3}", fSum, valueSum, totalValue - valueSum, diff2Sum);
    Console.WriteLine("Diff^2 Sum = {0}", diff2Sum);
}

印出的結果

 

 

MyDivider1

id

factor

value

Diff.

0

40

0

-0.4

1

20

1

0.8

2

20

0

-0.2

3

20

0

-0.2

 

 

 

 

SUM:

100

1

0

Diff^2 Sum = 0.8800

 

結果很正常:總共沒有多發錢、也把錢分完了、每個人的差也小於一元。

但仔細一看──這可奇怪了! 出40%的人沒分到錢,出20%的卻分到了!

這只是一個極端的例子。事實上,在其他的例子中,會出現"為什麼我比他多出10元、分利潤時我卻少他一元"這種不公平的情況發生。

解決方法容我賣個關子(其實是我打累了),下次再說吧