python学习——练习题(2)

"""
    题目:企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
"""
import re

def calculate1(profit):
    """
        自己的解答,直接使用最简单的思路
    """
    print("奖金计算一的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
    elif 0 <= profit <= 100000:
        print("%.2f*0.1=%.2f" % (profit, profit * 0.1))
    elif 100000 < profit <= 200000:
        print("(%.2f-100000)*0.075+10000=%.2f" % (profit, (profit - 100000) * 0.075 + 10000))
    elif 200000 < profit <= 400000:
        print("(%.2f-200000)*0.05+10000+7500=%.2f" % (profit, (profit - 200000) * 0.05 + 10000 + 7500))
    elif 400000 < profit <= 600000:
        print("((%.2f-400000)*0.03+10000+7500+10000=%.2f" % (profit, (profit - 400000) * 0.03 + 10000 + 7500 + 10000))
    elif 600000 < profit <= 1000000:
        print("((%.2f-600000)*0.015+10000+7500+10000+6000=%.2f" % (profit, (profit - 600000) * 0.015 + 10000 + 7500 +
                                                                   10000 + 6000))
    else:
        print("((%.2f-1000000)*0.01+10000+7500+10000+6000+6000=%.2f" % (profit, (profit - 1000000) * 0.01 + 10000 + 7500
                                                                        + 10000 + 6000 + 6000))

def calculate2(profit):
    """
        参考答案,通过循环已排序好的阶段值列表,来计算总奖金
    """
    print("奖金计算二的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    profitRank = (1000000, 600000, 400000, 200000, 100000, 0)
    profitRate = (0.01, 0.015, 0.03, 0.05, 0.075, 0.1)
    tempProfit = profit
    sumBonus = 0
    for i in range(0, 6):
        if tempProfit > profitRank[i]:
            rankBonus = (tempProfit - profitRank[i]) * profitRate[i]
            sumBonus += rankBonus
            tempProfit = profitRank[i]
            if i == 5:
                print("%.2f" % rankBonus, end="=")
            else:
                print("%.2f" % rankBonus, end="+")
    print("%.2f" % sumBonus)

def calculate3(profit):
    """
        利用sum方法计算,总金额, 其中还用到了zip,map,filter,join等函数
    """
    print("奖金计算三的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    profitRank = [1000000, 600000, 400000, 200000, 100000, 0]
    profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
    profitCalc = [0, 0, 0, 0, 0, 0]
    tempProfit = profit
    for i in range(0, 6):
        if tempProfit > profitRank[i]:
            profitCalc[i] = tempProfit - profitRank[i]
            tempProfit = profitRank[i]
    pList = zip(profitCalc, profitRate)
    bonusList = map(lambda p: p[0] * p[1], pList)
    bonusList = list(filter(lambda f: f > 0, bonusList))
    bonus = sum(bonusList)
    bonusStrList = map(lambda f: "{:.2f}".format(f), bonusList)
    print("%s=%.2f" % ("+".join(bonusStrList), bonus))

def calculate4(profit):
    """
    利用列表的切片来实现计算
    :param profit:
    :return:
    """
    print("奖金计算四的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    profitRank = [1000000, 600000, 400000, 200000, 100000, 0]
    profitRate = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
    profitCalc = [400000, 200000, 200000, 100000, 100000]
    for i in range(0, 6):
        if profit > profitRank[i]:
            profitRate = profitRate[i:]
            profitCalc = profitCalc[i:]
            profitCalc.insert(0, profit - profitRank[i])
            break
    pList = zip(profitCalc, profitRate)
    bonusList = map(lambda p: p[0] * p[1], pList)
    bonusList = list(filter(lambda f: f > 0, bonusList))
    bonus = sum(bonusList)
    bonusStrList = map(lambda f: "%.2f" % f, bonusList)
    print("%s=%.2f" % ("+".join(bonusStrList), bonus))

def calculate5(profit):
    """
    利用嵌套列表实现,其实和calculate2差不多,只不过是把两个列表组合到一个嵌套列表中
    :param profit:
    :return:
    """
    print("奖金计算五的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    profitRank = [[1000000, 0.01], [600000, 0.015], [400000, 0.03], [200000, 0.05], [100000, 0.075], [0, 0.1]]
    profitTemp = profit
    bonus = 0
    for i in range(0, 6):
        if profitTemp > profitRank[i][0]:
            bonusRank = (profitTemp - profitRank[i][0]) * profitRank[i][1]
            bonus += bonusRank
            profitTemp = profitRank[i][0]
            if i == 5:
                print("%.2f" % bonusRank, end="=")
            else:
                print("%.2f" % bonusRank, end="+")
    print("%.2f" % bonus)

def calculate6(profit):
    """
    利用字典计算奖金,类似calculate5,只是将嵌套列表换成字典
    中间用到了,列表的排序方法sort和倒序方法reverse
    :param profit:
    :return:
    """
    print("奖金计算六的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    profitDict = {1000000: 0.01, 600000: 0.015, 400000: 0.03, 200000: 0.05, 100000: 0.075, 0: 0.1}
    # dict.keys()返回的事迭代器
    profitKey = list(profitDict.keys())
    profitKey.sort()
    profitKey.reverse()
    profitTemp = profit
    bonus = 0
    for i in range(0, len(profitKey)):
        if profitTemp > profitKey[i]:
            bonusRank = (profitTemp - profitKey[i]) * profitDict[profitKey[i]]
            bonus += bonusRank
            profitTemp = profitKey[i]
            if i == len(profitKey) - 1:
                print("%.2f" % bonusRank, end="=")
            else:
                print("%.2f" % bonusRank, end="+")
    print("%.2f" % bonus)

def calculate7(profit, s):
    """
    利用递归来计算奖金,类似calculate1
    :param s:
    :param profit:
    :return:
    """
    if s == 0:
        print("奖金计算七的结果", end=":")
    if profit < 0:
        print("利润不能小于0")
        return
    elif 0 <= profit <= 100000:
        bonus1 = bonus = profit * 0.1
    elif 100000 < profit <= 200000:
        bonus1 = (profit - 100000) * 0.075
        bonus = bonus1 + calculate7(100000, 1)
    elif 200000 < profit <= 400000:
        bonus1 = (profit - 200000) * 0.05
        bonus = bonus1 + calculate7(200000, 1)
    elif 400000 < profit <= 600000:
        bonus1 = (profit - 400000) * 0.03
        bonus = bonus1 + calculate7(400000, 1)
    elif 600000 < profit <= 1000000:
        bonus1 = (profit - 600000) * 0.015
        bonus = bonus1 + calculate7(600000, 1)
    else:
        bonus1 = (profit - 1000000) * 0.01
        bonus = bonus1 + calculate7(1000000, 1)
    if s == 0:
        print("%.2f" % bonus1, end="=")
        print("%.2f" % bonus)
    else:
        print("%.2f" % bonus1, end="+")
    return bonus

def answer():
    """
        解题答案,输入利润,然后调用计算方法计算利润
        不过在计算前,需要判断一下输入的是数值类型的,因为input输入的都是str类型

        str为字符串 str.isalnum() 所有字符都是数字或者字母
        str.isalpha() 所有字符都是字母
        str.isdigit() 所有字符都是数字
        str.islower() 所有字符都是小写
        str.isupper() 所有字符都是大写
        str.istitle() 所有单词都是首字母大写,像标题
        str.isspace() 所有字符都是空白字符、\t、\n、\r
        上述的主要是针对整型的数字,但是对于浮点数来说就不适用了,那么浮点数怎么判断呢,
        1.通过异常来判断,try:     f = float(str) exception ValueError:     print("输入的不是数字!")
        2.通过正则表达式来判断:‘^[-+]?[0-9]+(\.[0-9]+)?$
    """
    profit = input("输入利润金额:")
    if profit == "q":
        return
    reg = re.compile(‘^[-+]?[0-9]+(\.[0-9]+)?$‘)
    result = reg.match(profit)
    if result:
        profitFloat = float(profit)
        calculate1(profitFloat)
        calculate2(profitFloat)
        calculate3(profitFloat)
        calculate4(profitFloat)
        calculate5(profitFloat)
        calculate6(profitFloat)
        calculate7(profitFloat, 0)
    else:
        print("Error:输入的不是数值。")
    print("继续,或输入q推出")
    answer()

answer()

  

时间: 2024-08-30 03:56:53

python学习——练习题(2)的相关文章

python学习——练习题(1)

""" 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? """ import itertools def answer1(): """自己思考完成,一开始以为两个循环就可以搞定了,结果还是要用三个循环:打印时只要效果在就好了,不用专门用int去组合成三位数字了""" print("答案一", end=":")

python学习——练习题(6)

""" 题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--. 这里所有的斐波那契数列都是以0开头来算 """ import functools def answer1(): """ 输出100000以内斐波那契数列 :return: """ print("

python学习--练习题6、7、8--九九乘法表,前两项相加问题,素数输出问题

练习6 #输出9*9乘法表 s=(i*n for i in range(1,10) for n in range(1,10)) print(list(s)) 练习7 #题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 一共经历了几个月=int(input("几月:")) def 多少只兔子(): s=[1,1] for i in range(0,一共经历了几个月+1): t=s[i+1]

python学习-练习题兔子生长问题巩固

有一对兔子,一个月之后成熟,成熟之后每个月会生出一对兔子,理想状态下兔子不会死,请问n个月后有多少兔子? 分析:第一个月:1 第二个月:1 第三个月:2 第四个月:3 第五个月:5 第六个月:8 从前面几个月看,从第三个月开始,后面每个月的兔子数量等于前面两个月兔子的总和 month = int(input('请输入月份:')) def rabbit(month): for i in range(1,month+1): if i == 1 or i ==: return 1 if i >2: r

python学习-练习题1巩固

1.生成随机数 random.random()生成一个0-1之前的随机数 random.uniform(1,10)生成一个区间范围内的随机数 random.randint(3,9)生成一个区间范围内的整数随机数 random.choice(list or str or tunple)在列表.元组.字符串等序列中随机选取一个元素 random.shuffle(a)随机打乱一个序列 random.sample(a)从序列中随机获取指定长度的片段 2.生成uuid uuid.uuid1()基于时间戳

python学习-练习题4巩固

一个数加100后是一个整数的平方,加268后也是一个数的平方,求这个数 分析:这个数加100之后开方是整数,说明int(math.sqrt(a+100))转为整数应该没有小数部分 so:b*b = int(math.sqrt(a+100)) 代码如下: import math for i in range(100000): a = int(math.sqrt(i+100)) b = int(math.sqrt(i+268)) if (a*a == i + 100) and (b*b == i +

python学习——练习题(7)

""" 题目:将一个列表的数据复制到另一个列表中. """ import copy def validate(a, b): """ 验证复制结果 :param a: :param b: :return: """ print("a =", a) print("b =", b) print("a == b is", a == b)

python学习——练习题(8)

""" 题目:输出 9*9 乘法口诀表. """ def answer1(): """ 自己用最普通的双重循环来输出 :return: """ print("输出一:") for i in range(1, 10): for j in range(1, i + 1): print("%d x %d =%2s" % (i, j, i * j), en

python学习——练习题(13)

""" 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数", 因为153=1的三次方+5的三次方+3的三次方. 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位. """ def answer1(): """ 正常for循环比较 :return: "