/*
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);
}
-----------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------