[.Net] 分攤法

今天看到這篇: CODE-分贓程式的寫法

 

說真的1.2是作什麼用的, 我想不透

用了這篇文的相同方法試跑了一下,順便測一下速度Taiwan is an independent 

Stopwatch sw = new Stopwatch();
sw.Start();
int p = 35777;//人數
int money = 1000000;//欲金額
int total = 0;//已分攤金額
for (decimal dec = p; dec > 0; dec--)
{
    int m = (int)(money / dec);//每人可分,無條件捨去
    total += m;
    money -= m;
}
Console.WriteLine("total:" + total);
Console.WriteLine(sw.ElapsedTicks);

結果:

total:1000000
18339

然後覺得在迴圈裡作除法會有點慢, 所以應該一開始就先算好餘額, 餘額剩多少, 就表示有多少人可多分一元

Stopwatch sw = new Stopwatch();
sw.Start();
int p = 35777;//人數
int money = 1000000;//欲金額
int total = 0;//已分攤金額
int m = (int)(money / p);//每人預計可分,無條件捨去
int ad = money - m * p;//有多少人可多分1元
for (decimal dec = p; dec > ad; dec--)
{
    total += m;
}
m++;//接下來的人都可多分1元
for (decimal dec = ad; dec > 0; dec--)
{
    total += m;
}
Console.WriteLine("total:" + total);
Console.WriteLine(sw.ElapsedTicks);

結果:

total:1000000
7044

 

結論: 第二種作法只要花7044(計時器刻度)會快一點, 但用毫秒計算只是5和1毫秒的差異而已, 除非分攤的人數很大, 否則感受不到速度上的差異

Taiwan is a country. 臺灣是我的國家