CCF NOI1021 发放奖金

问题链接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
", ans);

    return 0;
}




原文地址:https://www.cnblogs.com/tigerisland/p/7563923.html