今天遇到这样一个问题:企业发放的奖金根据利润I提成:
利润I低于或等于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,求应发奖金总数。
遇到这样一个问题,一般人可能会想到if,elif,但是我是一般人吗?
于是我对这个问题陷入了沉思,我想了一想,先把通解写出来吧:
profit = float(input())
# 初始化奖金总数
bonus = 0
if profit <= 100000:
# 利润低于等于100000元,提成10%
bonus = profit * 0.10
elif 100000 < profit <= 200000:
# 利润在100000到200000之间
bonus = 100000 * 0.10 + (profit - 100000) * 0.075
elif 200000 < profit <= 400000:
# 利润在200000到400000之间
bonus = 100000 * 0.10 + 100000 * 0.075 + (profit - 200000) * 0.05
elif 400000 < profit <= 600000:
# 利润在400000到600000之间
bonus = 100000 * 0.10 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03
elif 600000 < profit <= 1000000:
# 利润在600000到1000000之间
bonus = 100000 * 0.10 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015
else:
# 利润超过1000000,超过部分按1%提成
bonus = 100000 * 0.10 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01
print("应发奖金总数为:",int(bonus),"元")
细看,这不对吧,要是他没完没了怎么办?
不如我们构造一个函数,一个名为 `run` 的函数。
创建了一个列表 `ranges`,其中包含了多个元组。每个元组包含两个值,第一个值是利润上限 `limit`,第二个值是对应的提成率 `rate`。这些元组表示了不同的利润范围和对应的提成率。
`for limit, rate in ranges:`:这一行启动了一个循环,用于遍历 `ranges` 列表中的元组,其中 `limit` 表示利润上限,`rate` 表示提成率。
`if profit <= limit:`:这一行检查当前的利润 `profit` 是否小于或等于当前范围的上限 `limit`。
如果 `profit` 小于或等于 `limit`,表示当前范围足够覆盖利润,那么计算当前范围内的奖金,并将其累加到 `bonus` 中,然后使用 `break` 退出循环,因为已经计算完奖金。
如果 `profit` 大于 `limit`,表示当前范围不够覆盖全部利润,那么计算当前范围内的奖金,并将其累加到 `bonus` 中,然后从 `profit` 中减去当前范围的上限 `limit`,以便在下一次迭代中处理剩余的利润。
总之,这段代码用于根据不同的利润范围和提成率计算奖金,并最得出计算得到的奖金。
def run(profit):
x=100000
bonus = 0
ranges = [(x, 0.10), (x, 0.075), (2*x, 0.05), (2*x, 0.03), (4*x,0.015), (float('inf'), 0.01)]
for limit, rate in ranges:
if profit <= limit:
bonus += profit * rate
break
else:
bonus += limit * rate
profit -= limit
return bonus
profit = float(input())
result = run(profit)
print(int(result))
怎么样,是不是觉得我很牛逼?