C语言经典算法100例002

/*
  Name: C语言经典算法100例002
  Copyright: **
  Author: 巧若拙
  Date: 24-08-14 14:52
  Description:
  题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?            
*/

/*算法分析:
    分别把利润节点和对应提成比率存储到2个数组中,本题目中共有6个利润节点(其中利润为0算作第一个节点),
profit[i]~profit[i+1]阶段的提成率为reward[i]。
    fun1()从最大的利润节点开始遍历整个数组,找到“有效”的利润节点,先算出超出该节点部分的奖金,再计算该利润节点对应的奖金。
把所有奖金累积起来。
    fun2()反其道而行,先计算利润节点之内的奖金,再加上超出部分奖金。相对来说fun2()较好理解,用时较短。
*/

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define MAX 6

void fun1(void);
void fun2(void);

int main(void)
{
 fun1();
 fun2();
 
 system("pause");
    return 0;
}

void fun1(void)
{
    float profit[MAX]={0, 10, 20, 40, 60, 100};
    float reward[MAX]={0.1, 0.075, 0.05, 0.03, 0.015, 0.01};
    float pro = 0, rew = 0;
    int i;
   
    puts("请输入当月利润:");
    scanf("%f", &pro); printf("\nlirun: %f\n", pro);
   
    for (i=MAX-1; i>=0; i--)
    {
        if (pro > profit[i]) //寻找“有效”的利润节点,即利润必须大于该利润节点
        {
            rew += (pro - profit[i]) * reward[i]; //先计算超出部分奖金
            pro = profit[i]; //再计算剩余部分奖金,恰好等于某个利润节点
        }
    }
   
    printf("\n提成为: %f\n", rew);
}

void fun2(void)
{
    float profit[MAX]={0, 10, 20, 40, 60, 100};
    float reward[MAX]={0.1, 0.075, 0.05, 0.03, 0.015, 0.01};
    float pro = 0, rew = 0;
    int i = 0;
   
    puts("请输入当月利润:");
    scanf("%f", &pro); printf("\nlirun: %f\n", pro);
   
    while ((i < MAX-1) &&  pro > profit[i+1])//先计算利润节点之内的奖金
    {
        rew += (profit[i+1] - profit[i]) * reward[i];
        i++;
    }

    rew += (pro - profit[i]) * reward[i]; //再加上超出部分奖金
          
    printf("\n提成为: %f\n", rew);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值