解题思路:
本题共有六种情况,分别是:
低于等于100000
高于100000,低于等于200000
高于200000,低于等于400000
高于400000,低于等于600000
高于600000,低于等于1000000
高于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分
8 人评分
#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; }
#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; } 求问大佬,为啥我这样写是错的
高级蛋白质 2022-04-13 16:12:42 |
首先,不说前面写的,就循环体内部的这条语句: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开始,循环次数增加一次
WhiteRose 2023-05-08 22:06:40 |
在定义变量 amount 时的赋值中多出了个逗号
WhiteRose 2023-05-08 22:27:56 |
#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 2023-05-08 22:28:12 |
#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; }
数列排序 (C语言代码)浏览:860 |
ASCII帮了大忙浏览:801 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:694 |
1157题解浏览:771 |
简单的a+b (C语言代码)浏览:1025 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:736 |
哥德巴赫曾猜测 (C语言代码)浏览:778 |
整数分类 oj上总是wrong answer浏览:688 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:615 |