問題連結:CCF NOI1021 發放獎金。
時間限制: 1000 ms 空間限制: 262144 KB
題目描述
企業發放的獎金根據利潤分段計算提成。當利潤I低於或等於10萬元的,獎金可提10%;利潤高於10萬元,低於20萬元,低於10萬元的部分按10%提成,高於10萬元的部分,可提成7.5%;20萬到40萬的,低於20萬的部分仍按上述辦法提成(下同)。高於20萬元的部分按5%提成;40萬到60萬時,高於40萬的部分按3%提成;60萬到100萬時,高於60萬的部分按1.5%提成;I>=100萬元時,超過100萬元的部分按1%提成。輸入當月利潤I,求應發獎金總數(單位為元)。(輸出保留小數點後三位)
輸入
輸入實數I,表示利潤。
輸出
輸出獎金數,答案保留三位小數。
範例輸入
100000
範例輸出
10000.00
資料範圍限制
0<I<=1,000,000
問題分析
這個問題是一個分段計算的問題。
寫程式時,有一種做法是將問題中給出的參數寫入程式碼中。這種做法使得程式的可修改性變差。雖然程式可以正確,但是給差評。
程式說明
程式中,使用兩個數組來儲存問題中給定的參數。這樣使得程式的可修改性得到提高,那些參數改變時不需要修改程式碼,只需要修改數組資料。
需要注意的是,由於資料值比較大,需要使用double類型,保證程式算出正確結果。
程式中,宏定義符號變數N,也是增加程式通用性的有效做法。
要點詳解 使用數組儲存原始參數是一種好的做法,可以增加程式的可修改性。參數值改變時,不需要修改程式碼,只需要修改數組資料。 資料值比較大時,要使用double類型,否則結果會出錯。
100分通過的C語言程式:
#include <stdio.h>int profit[] = {0, 100000, 200000, 400000, 600000, 1000000};double ratio[] = {0, 0.1, 0.075, 0.05, 0.03, 0.015, 0.01};#define N (int)(sizeof(profit) / sizeof(int))int main(void){ double p, ans; int i; scanf("%lf", &p); ans = 0; for(i=1; i<N; i++) { if(p <= profit[i]) { ans += (p - profit[i - 1]) * ratio[i]; break; } else ans += (profit[i] - profit[i - 1]) * ratio[i]; } if(i == N && p > profit[N - 1]) ans += (p - profit[N - 1]) * ratio[N]; printf("%.3lf\n", ans); return 0;}