Test Message

a647: 投資專家

內容

John 是一個赫赫有名的藝術品投資專家,每個月都會計算藝術品投資的盈虧,以審視其獲利。John 每個月月底,即開始計算其每一件藝術品的獲利狀況。由於藝術品的種類繁多,John 每個月總是要花費許多時間,計算其獲利狀況,以決定是否要將藝術品出脫。因此,他想麻煩你撰寫一支程式,計算每一件藝術品的盈虧狀況。


輸入

測試資料的第一行是一個整數 n,代表 John 總共投資了 n 件藝術品。以下 n 行,每一行有兩個整數 m 和 p,m 是該藝術品投資的金額、p 是該藝術品目前的價值。其中 1≤m,p≤100000,單位是仟元。

4
200 177
200 200
892 1000
1000 992

輸出

每一件藝術品依據它的投資金額及目前價值,計算並輸出其獲利率 x。x 為正,表示獲利;x 為負表示虧損。若 x≥10.00% 或 x≤-7.00%,即售出該藝術品,以「dispose」表示;否則,即保留該藝術品,以「keep」表示。輸出格式,請見輸出範例。

-11.50% dispose
0.00% keep
12.11% dispose
-0.80% keep


解題思路

用 EPS ( epsilon,表示一個不影響計算結果的極小值) 修正浮點數特定情況下計算後的產生的誤差, EPS2 修正 -0.00% 的問題。

修正完之後就是基本的 if 判斷。


完整程式碼

AC (2ms, 104KB)
#include <stdio.h>
#define EPS 0.00001
#define EPS2 0.0001

int main()
{
int n, m, p;
double gap;
while (scanf(" %d", &n) == 1)
{
for (int i = 0; i < n; i++)
{
scanf(" %d %d", &m, &p);
gap = (double)((p - m) * 100) / m;
gap += gap < 0 ? -EPS : EPS;
if (gap < EPS2 && gap > -EPS2)
gap = 0;
printf("%.2lf%% %s\n", gap, gap < 10 && gap > -7 ? "keep" : "dispose");
}
}
return 0;
}