奖金提成 向下取整、向上取整的方法

企业发放的奖金根据利润提成。
 利润低于或等于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    (0<M<=N,M,N∈Z)

 

不失一般性,我们设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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值