企业发放的奖金根据利润提成。
利润低于或等于100000元的,奖金可提10%;
利润高于100000元,低于200000元(100000<I≤200000)时;
低于100000元的部分按10%提成;
高于100000元的部分,可提成 7.5%;
200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同);
高于200000元的部分按5%提成;
400000<I≤600000元时,高于400000元的部分按3%提成;
600000<I≤1000000时,高于600000元的部分按1.5%提成;
I>1000000时,超过1000000元的部分按1%提成。
从键盘输入当月利润I,求应发奖金总数( 备注:奖金向下取整,不作四舍五入处理。)
这个问题主要在怎么向下取整
C语言有以下几种取整方法:
1、直接赋值给整数变量。如:
int i = 2.5; 或 i = (int) 2.5;
这种方法采用的是舍去小数部分
2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),但是整数除法对负数的取整结果和使用的C编译器有关。
3、使用floor函数。floor(x)返回的是小于或等于x的最大整数。如:
floor(2.5) = 2
floor(-2.5) = -3
4、使用ceil函数。ceil(x)返回的是大于x的最小整数。如:
ceil(2.5) = 3
ceil(-2.5) = -2
floor()是向负无穷大舍入,floor(-2.5) = -3;ceil()是向正无穷大舍入,ceil(-2.5) = -2。
但是在C里面ceil和floor()函数是返回double型,
向上取整方法;在代码里可以这样计算:
int nn=(N-1)/M +1 因为'/'是往下取整的。
这里我们用<>表示向上取整,[]表示向下取整,那么怎么来表示这个值呢?
我们可以证明:
<N/M>=[(N-1)/M]+1
不失一般性,我们设N=Mk+r(0<=r<M),
1)当r>0时,
左边:<N/M>=<(Mk+r)/M>=<k+r/M>=k+<r/M>=k+1
右边:[(N-1)/M]+1=[(Mk+r-1)/M]+1=[k+(r-1)/M]+1=k+1+[(r-1)/M]=k+1
2)当r=0
左边:<N/M>=k
右边:[(N-1)/M]+1=[(Mk-1)/M]+1=[(M(k-1)+M-1)/M]+1=[k-1+(M-1)/M]+1=k+[(M-1)/M]=k
命题得证。
方法1:使用floor函数
#include <stdlib.h>
#include "oj.h"
#include <math.h>
#include <iostream>
using namespace std;
/*
功能:
企业发放的奖金根据利润提成。
利润低于或等于100000元的,奖金可提10%;
利润高于100000元,低于200000元(100000<I≤200000)时;
低于100000元的部分按10%提成;
高于100000元的部分,可提成 7.5%;
200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同);
高于200000元的部分按5%提成;
400000<I≤600000元时,高于400000元的部分按3%提成;
600000<I≤1000000时,高于600000元的部分按1.5%提成;
I>1000000时,超过1000000元的部分按1%提成。
从键盘输入当月利润I,求应发奖金总数
输入:
一个整数,当月利润 x
输出:
无
返回:
一个整数,奖金
*/
size_t Bonus(size_t profit)
{
if(profit < 0)
return 0;
size_t bonus = 0;
if(profit <= 100000)
bonus = (size_t)floor(profit * 0.1);
else if(profit <= 200000)
bonus = 10000 + (size_t)floor((profit - 100000) * 0.075);
else if(profit <= 400000)
bonus = 17500 + (size_t)floor((profit - 200000) * 0.05);
else if(profit <= 600000)
bonus = 27500 + (size_t)floor((profit - 400000) * 0.03);
else if(profit <= 1000000)
bonus = 33500 + (size_t)floor((profit - 600000) * 0.015);
else if(profit > 1000000)
bonus = 39500 + (size_t)floor((profit - 1000000) * 0.01);
return bonus;
}
方法2:使用 整数除法运算符“/”本身就有的取整功能
size_t Bonus(size_t profit)//整数除法运算符“/”
{
if(profit < 0)
return 0;
size_t Bonus = 0;
if(profit <= 100000)
Bonus = (size_t)(profit * 0.1) / 1;//除1,整数,c中默认是向下取整的
else if(profit <= 200000)
Bonus = (size_t)(10000 + (profit - 100000) * 0.075 / 1);
else if(profit <= 400000)
Bonus = (size_t)(17500 + (profit - 200000) * 0.05 / 1);
else if(profit <= 600000)
Bonus = (size_t)(27500 + (profit - 400000) * 0.03 / 1);
else if(profit <= 1000000)
Bonus = (size_t)(33500 + (profit - 600000) * 0.015 / 1);
else if(profit > 1000000)
Bonus = (size_t)(39500 + (profit - 1000000) * 0.01 / 1);
return Bonus;
}