解题思路:

本题共有六种情况,分别是:

  1. 低于等于100000

  2. 高于100000,低于等于200000

  3. 高于200000,低于等于400000

  4. 高于400000,低于等于600000

  5. 高于600000,低于等于1000000

  6. 高于1000000

而本题难点主要在于,每阶段都需要计算

意思就是就算输入400000,也要计算完高于100000,低于200000的利润得出的奖金,然后再加上高于200000,低于等于400000的利润得出的奖金

如果每阶段连着之前的利润一起算的话,容易出错(我觉得qw

而从第二种情况开始,有一部分的奖金是固定的,意思就是你只要达到了这个部分,那么是绝对满足前面一部分的利润的

如高于100000,低于等于200000

高于100000的部分是绝对满足的,而多出来多少我们不知道也不确定

这时候就可以提前计算高于100000部分的奖金,然后后面等多出来部分的奖金计算出来后直接相加即可

我们可以使用#define,将那些每阶段固定的部分提前计算,然后整合即可

我将第二阶段的固定奖金命名为L1

第三阶段为L2

第四阶段为L3

第五阶段为L4

……

这样,只需要用获取到的的利润减去每阶段的定值,然后计算出多出部分的奖金再和之前我们用#define整合的对应阶段的奖金相加即可

注意事项:

先后顺序

每阶段的固定奖金
参考代码:

#include<stdio.h>

#define L1 (100000*0.1)//高于100000,低于等于200000的奖金

#define L2 ((100000*0.1)+(100000*0.075))//高于200000,低于等于400000的奖金

#define L3 ((100000*0.1)+(100000*0.075)+(200000*0.05))//高于400000,低于等于600000的奖金

#define L4 ((100000*0.1)+(100000*0.075)+(200000*0.05)+(200000*0.03))//高于600000,低于等于1000000的奖金

#define L5 ((100000*0.1)+(100000*0.075)+(200000*0.05)+(200000*0.03)+(400000*0.015))//高于1000000的奖金

int main(void)
{
	int i;
	scanf("%d", &i);//获取输入
	if (i <= 100000)
	{
		i = i * 0.1;
	}
	else if (i > 100000 && i <= 200000)
	{
		i -= 100000;//减去该阶段的定值
		i *= 0.075;//计算除定值外多余利润的奖金
		i += L1;//多余利润的奖金加上该阶段的固定奖金
	}
	else if (i > 200000 && i <= 400000)
	{
		i -= 200000;//同上
		i *= 0.05;
		i += L2;
	}
	else if (i > 400000 && i <= 600000)
	{
		i -= 400000;//同上
		i *= 0.03;
		i += L3;
	}
	else if (i > 600000 && i <= 1000000)
	{
		i -= 600000;//同上
		i *= 0.015;
		i += L4;
	}
	else if (i > 1000000)
	{
		i -= 1000000;//同上
		i *= 0.01;
		i += L5;
	}
	printf("%d", i);//输出总奖金
	return 0;
}


点赞(0)
 

0.0分

6 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 7 条评论

WhiteRose 1年前 回复TA
#include <stdio.h>

int main()
{
    int profit;         // 利润
    int prize = 0;      // 奖金

    const int levels[] = { 1000000, 600000, 400000, 200000, 100000, 0 };
    const float rates[] = { 0.01, 0.015, 0.03, 0.05, 0.075, 0.1 };

    scanf("%d", &profit);

    for (int i = 0; i < 6; i++) {
        if (profit > levels[i]) {
            prize += (profit - levels[i]) * rates[i];
            profit = levels[i];
        }
    }

    printf("%d\n", prize);

    return 0;
}
WhiteRose 1年前 回复TA
@叾汨 #include <stdio.h>  int main() {     int profit;         // 利润     int prize = 0;      // 奖金      const int levels[] = { 1000000, 600000, 400000, 200000, 100000, 0 };     const float rates[] = { 0.01, 0.015, 0.03, 0.05, 0.075, 0.1 };      scanf("%d", &profit);      for (int i = 0; i < 6; i++) {         if (profit > levels[i]) {             prize += (profit - levels[i]) * rates[i];             profit = levels[i];         }     }      printf("%d
", prize);      return 0; }
WhiteRose 1年前 回复TA
@叾汨 #include <stdio.h>  int main() {     int profit;         // 利润     int prize = 0;      // 奖金      const int levels[] = { 1000000, 600000, 400000, 200000, 100000, 0 };     const float rates[] = { 0.01, 0.015, 0.03, 0.05, 0.075, 0.1 };      scanf("%d", &profit);      for (int i = 0; i < 6; i++) {         if (profit > levels[i]) {             prize += (profit - levels[i]) * rates[i];             profit = levels[i];         }     }      printf("%d
", prize);      return 0; }
WhiteRose 1年前 回复TA
@叾汨 在定义变量 amount 时的赋值中多出了个逗号
高级蛋白质 2年前 回复TA
@叾汨 首先,不说前面写的,就循环体内部的这条语句:mon[i]=amount[i]-amount[i-1];来说,你的本义是如果if条件判断输入的利润如果大于100000,那么就让本月的固定利润减去前一月的利润,然后将余下的利润赋给mon数组的当前元素,可是,你这里忽略了一个问题,就是第一次进入循环体的时候,i的值必定为0,那么就意味着数组amount[i-1]的下标为-1,而正常来说,数组的下标为0到其最大长度-1,-1不在这个范围内,所以其值是无法确定的,这就导致得出的结果不是你所期望的,你可以先修改一下这个错误,我这里有个建议,你可以看看,就是将数组的长度延长一位,将amount[0]的值为0,amount[1]的值为100000,然后循环时i的值从1开始,循环次数增加一次
叾汨 2年前 回复TA
#include<stdio.h>
int main(void)
{
	float rate[6]={0.1,0.075,0.05,0.03,0.015,0.01};
	int money=0;
	float bonus=0;
	scanf("%d",&money);
	int amount[5]={100000,200000,400000,600000,1000000,};
	int mon[6]={0};
	int i=0,n=0;
	for( i=0; i<=4; i++ )
	{
		if( (money-amount[i])>=0 )
		{
			mon[i]=amount[i]-amount[i-1];
			n++;
		}else
		{
			mon[n]=money-amount[i-1];
			break;
		}
		if( money>amount[4] )
		{
			mon[5]=money-amount[4];
		 } 
	}
	i=0;
	for( i=0;i<=5;i++ )
	{
		bonus+=(mon[i]*rate[i]);
	}
	printf("\n");
	printf("%.0f\n",bonus);

	return 0;
}
求问大佬,为啥我这样写是错的
小小的计科生 2年前 回复TA
简洁