【C 语言经典100例 | 菜鸟教程】C 语言练习实例2

解题思路:

  1. 可以考虑借鉴等差数列的特殊情况,公差为0的方式来实现。
  2. 将输入数字分解成n个a1组成的等差数列,其公差d为0,且a1=100000,且an<=a1
  3. 再对每个元素根据其顺序进行加权,各区间对应权重为:
    [0,1)=0.1
    [1,2)=0.075
    [2~3]=0.05
    [4~5]=0.03
    [6~9]=0.015
    [10~+∞]=0.01
  4. 最后各区间加权后的数字相加得到奖金总额

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

Result

L2-Result

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值