解题思路:
- 可以考虑借鉴等差数列的特殊情况,公差为0的方式来实现。
- 将输入数字分解成n个a1组成的等差数列,其公差d为0,且a1=100000,且an<=a1
- 再对每个元素根据其顺序进行加权,各区间对应权重为:
[0,1)=0.1
[1,2)=0.075
[2~3]=0.05
[4~5]=0.03
[6~9]=0.015
[10~+∞]=0.01 - 最后各区间加权后的数字相加得到奖金总额
L2.h
//
// Created by crazy_rays on 2022/8/30.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//
#ifndef CTEST100_L2_H
#define CTEST100_L2_H
#endif //CTEST100_L2_H
#include <stdio.h>
#include <math.h>
/**
* 题目:企业发放的奖金根据利润提成。
*
* 利润(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,求应发放奖金总数?
*
* 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成双精度浮点(double)型。
*/
void L2();
L2.c
//
// Created by crazy_rays on 2022/8/30.
// References from : https://www.runoob.com/cprogramming/c-100-examples.html
//
#include "../include/L2.h"
/**
* 计算权重
* @param i 数列项序号
* @return
*/
double getPower(int i) {
double rate;
switch (i) {
case 0:
rate = 0.1;
break;
case 1:
rate = 0.075;
break;
case 2:
case 3:
rate = 0.05;
break;
case 4:
case 5:
rate = 0.03;
break;
case 6:
case 7:
case 8:
case 9:
rate = 0.015;
break;
default:
rate = 0.01;
break;
}
return rate;
}
/**
* 题目:企业发放的奖金根据利润提成。
*
* 利润(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,求应发放奖金总数?
*
* 程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成双精度浮点(double)型。
*/
void L2() {
printf("\nLesson 2 :\n");
/*
* 可以考虑借鉴等差数列的特殊情况,公差为0的方式来实现。
* 将输入数字分解成n个a1组成的等差数列,其公差d为0,且a1=100000,且an<=a1
* 再对每个元素根据其顺序进行加权
* 各区间对应权重为[0,1)=0.1, [1,2)=0.075, [2~3]=0.05, [4~5]=0.03, [6~9]=0.015, [10~+∞]=0.01
* 最后各区间加权后的数字相加得到奖金总额
*/
double a1 = 100000.0;
double benefit;
double bonus = 0.0;
scanf("%lf", &benefit);
printf("您的利润是:%.2lf\n", benefit);
/*
* 输入的数字比a1大且有有余数时(benefit > a1 && mod > 0),数列项数应为n+1
* 输入的数字比a1大且没有余数时(benefit > a1 && mod ==0),数列项数应为n
* 输入的数字等于a1时和输入的数字小于a1时(mod > 0 && n <= 1),数列项数为1
*/
int n = benefit > a1 ?
fmod(benefit, a1) > 0 ?
(int) (benefit / a1) + 1 :
(int) (benefit / a1) :
1;
for (int i = 0; i < n; ++i) {
double rate = getPower(i);
if (i == n - 1) {
//an<=a1情况
a1 = fmod(benefit, a1);
}
bonus += a1 * rate;
}
printf("提成为:%.2lf", bonus);
}