题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
解题思路:该题表面看起来非常简单,多个if条件分支就可以实现,但是仔细考虑,多个if条件应该不是本题意图,这样未免显得太无聊,由此想到列表和元组数据结构中有索引方法,此题意图应该是在这里。
方法一,先写出使用if分支的代码:
I = float(raw_input("Please input benefit of this month:" ))
if I <= 10:
bonus= I * 0.1
elif 10 < I <= 20:
bonus= 10 * 0.1 + (I-10) * 0.075
elif 20 < I <= 40:
bonus= 10 * 0.1 + 10 * 0.075 +(I-20) * 0.05
elif 40 < I <= 60:
bonus= 10 * 0.1 + 10 * 0.075 + 20 * 0.05 +(I-40)*0.03
elif 60 < I <= 100:
bonus= 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (I-60)*0.015
else:
bonus= 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 +(I-100) * 0.01
print bonus
方法二,使用列表方法,代码如下:
benefits = [0,10,20,40,60,100]
rates = [0.1,0.075,0.05,0.03,0.015,0.01]
bonus = 0
I = float(raw_input("Please input the benefit of this month: "))
for i in range(5,-1,-1):
while I > benefits[i]:
bonus += (I-benefits[i])*rates[i]
I = benefits[i]
print bonus,I
在使用列表方法编写代码的时候,遇到问题,利润按10,20…分等级,在benefits列表中利润是从小到大排列,如索引从小到大,则大于后一个索引代表的利润额的利润一定会大于前一个索引代表的利润额,这样计算的时候就出现错误,最终参考if分支判断,想到使用从大到小的索引,先取benefits[5],再取benefits[4],依次取到benefits[0],这样计算就没问题了。
方法三,使用列表方法,列表数据倒叙排列:
benefits = [100,60,40,20,10,0]
rates = [0.01,0.015,0.03,0.05,0.075,0.1]
bonus = 0
I = float(raw_input("Please input the benefit of this month: "))
for i in range(0,6):
if I > benefits[i]:
bonus += (I-benefits[i]) * rates[i]
I = benefits[i]
print bonus,I
方法四,使用元组方法,和使用列表是一样的,就不再赘述。
在编程学习中,一时间也许并不能想到最合适、最简单的方法完成整个代码,可以先用简单的if语句实现,再考虑复杂的实现。