奖金计算规则如下:
营业额低于或等于20万元时,奖金为营业额的11%。营业额高于20万元,低于40万元时,低于20万元的部分按11%计算,高于20万元的部分,按8.5%计算; 依此类推,40万到60万之间时高于40万元的部分,按3%计算; 60万到100万之间时,高于60万元的部分,按1.5%计算;高于100万元时,超过100万元的部分按1%计算。
一些感悟:在刚敲这道题的代码的时候我只是单纯地按照数学的思维去敲,但是在这过程中会发现会做很多重复性的工作,于是想到了去使用递归。不妨先从数学的角度看看这道题奖金的计算过程。
设营业额为x
- 当营业额低于或等于20万元时(x<=20),奖金为:0.11x
- 当营业额高于20万元,低于40万元时(20<x<=40),奖金为:20×0.11+0.85(x-20)
- 当营业额在40万到60万之间时(40<x<=60),奖金为:20×0.11+20×0.85+0.03(x-40)
- 当营业额在60万到100万之间时(60<x<=100),奖金为:20×0.11+20×0.85+20×0.03+0.015(x-40)
- 当营业额高于100万元时(x>100),奖金为:20×0.11+20×0.85+20×0.03+40×0.015+0.01(x-40)
从中可以发现要计算包括不同层次营业额的奖金,要依次单纯的列举出来重复的步骤有很多,这时就想到使用递归(正好课上也讲到这部分内容),于是决定自己写个递归试试。这里的递归通俗的理解,可以把每个条件语句想象成入口,return语句是出口。条件语句决定了应该进哪个门,return里边再调用自身就相当于出来的时候要通过不同的门,这样使用递归后比我之前写的代码要简洁很多。大致的思路如下:
以下是最终代码:
def Cal_bonus(n: int) -> float:
"""按营业额不等份额分段计算奖金,输出每段奖金数和奖金总额"""
# 营业额低于或等于20万元时
if n <= 20:
m = n
b = m * 0.11
print('*金额{:>2}万,比率{:>6},奖金{:.2f}万'.format(int(m), '11.00%', b))
# 由于数字的长度不同,所以为了美观打印,数字单独需要右对齐,奖金保留两位小数,以下方法相同
return b
# 营业额高于20万元,低于40万元时
elif 20 < n <= 40:
m = n - 20
b = m * 0.085
print('*金额{:>2}万,比率{:>6},奖金{:.2f}万'.format(int(m), '8.50%', b))
return Cal_bonus(20) + b
# 营业额高于40万元,低于60万元时
elif 40 < n <= 60:
m = n - 40
b = m * 0.03
print('*金额{:>2}万,比率{:>6},奖金{:.2f}万'.format(int(m), '3.00%', b))
return Cal_bonus(40) + b
# 营业额高于60万元,低于100万元时
elif 60 < n <= 100:
m = n - 60
b = m * 0.015
print('*金额{:>2}万,比率{:>6},奖金{:.2f}万'.format(int(m), '1.50%', b))
return Cal_bonus(60) + b
# 营业额高于100万元时
else:
m = n - 100
b = m * 0.01
print('*金额{:>2}万,比率{:>6},奖金{:.2f}万'.format(int(m), '1.00%', b))
return Cal_bonus(100) + b
def main():
turnover = float(input('请输入营业额(万元):'))
print('******奖金总计为:%.2f万元******' % Cal_bonus(turnover))
if __name__ == "__main__":
main()
运算结果如下:
输入14:
输入36:
输入58:
输入99:
输入101: