python100刷题 1-10

在网上找了一些python的题目进行练习,都会先自己实现一遍,然后再看网上比较好的其他解法。做的过程中也看到自己很多不足的地方,要多学习多积累多思考。继续努力~。
这些题目的链接是:python100练习

1.有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

# 1、by_nico 利用set去重后判断是否是3个不同数据
number = [1,2,3,4]
data_set = []
for i in number:
    for j in number:
        for k in number:
            if len(set([i,j,k]))==3:
                data = i*100+j*10+k
                data_set.append(data)
                print(data)
            else:
                continue
print('不重复的三位数一共有%d个'% len(data_set))

# 2、by_nico 减少循环的次数,用filter函数去掉前一个数,避免重复
number = [1,2,3,4]
for i in number:
    for j in filter(lambda x : x!=i,number):     # 留下满足条件的数据
        for k in filter(lambda x : (x!=i)&(x!=j),number):
            data = i*100+j*10+k
            print(data)

# 3、网上解法,在最后一层用三个不等于进行筛选           
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if( i != k ) and (i != j) and (j != k):
                print i,j,k

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,求应发放奖金总数?

# 1、by_nico 看过答案后才知道自己写得太复杂了。继续努力~
# 异常处理,避免输入非数值时报错
try:
    account = float(input("请输入当月利润"))
except:
    print("请重新输入正确利润:")

list_money = [100000,200000,400000,600000,1000000]
list_sec =[100000,100000,200000,200000,400000]  # 每段的金额
list_profit = [0.1,0.075,0.05,0.03,0.015,0.01]

#定义分段计算函数
def cal_money(account):
    sum_m=0
    for i in range(5):
        if (list_money[i]) <= account:
            sum_a = (list_sec[i])*list_profit[i]
            sum_m += sum_a
        else:
            if i == 0:   # account<10的时候会直接执行这一步
                sum_m = account*list_profit[i]
            else:
                sum_a = (account-list_money[i-1])*list_profit[i]  #大于最后一个阶段的余数进行处理
                sum_m += sum_a
            break
    # 正常循环完没有通过break跳出说明account大于100,再处理
    else:
        sum_a = (account-100)*list_profit[-1]
        sum_m += sum_a
    return sum_m

result = cal_money(account)
    
print(result)


# 2、网上解法
# 思考:以后再遇到数轴分界定位的问题,考虑倒序排列。改变count值为边界值循环相加
try:
    account = float(input("请输入当月利润"))
except:
    print("请重新输入正确利润:")
    
arr = [1000000,600000,400000,200000,100000,0]
rat = [0.01,0.015,0.03,0.05,0.075,0.1]
r = 0
for i in range(0,6):
    if account>arr[i]:
        r+=(account-arr[i])*rat[i]
        account=arr[i]  # 不断的改变account值为下一个边界值,循环递减,求得每个分段的数值相加。
print(r)

3.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

# 1、by_nico,缺点,有点暴力。前期没有做任何计算,缩小范围。人为的定个范围,答案有遗漏
import math
for i in range(1000):
    if math.sqrt(i+100)== int(math.sqrt(i+100)):   # 判断开方后是否为整数
        if math.sqrt(i+100+168)== int(math.sqrt(i+100+168)):
            print(i)
            
# 2、网上解法 
# 分析:
# x + 100 = n^2
# x + 100 + 168 = m^2
# m^2 - n^2 = 168
# (m + n) * (m - n) = 168
# m > n >= 0
# m最大值为168

for m in range(168):
    for n in range(m):
        if (m+n)*(m-n)==168:
            x=n**2-100
            print("符合条件的整数有:",x)

4.输入某年某月某日,判断这一天是这一年的第几天?

# 1.by_nico
import datetime
date_str = input('请输入日期(格式如:2018-09-11)')

#将str格式转换为date模式,方便提取年、月、日的值
date_data = datetime.datetime.strptime(date_str,'%Y-%m-%d')  

# 判断是否为闰年
list_days = [31,28,31,30,31,30,31,31,30,31,30,31]
if (date_data.year%4 ==0 and date_data.year%100 !=0) or date_data.year%400 ==0:
    list_days[1]=29  # 如果为闰年,把2月改成29天
    
count_days = date_data.day  # 初始赋值为day的取值
for i in range(date_data.month-1):
    count_days += list_days[i]  
    
print(count_days)

5.输入三个整数x,y,z,请把这三个数由小到大输出。

# 1.by_nico 一次性输入三个整数
list_data = input('请输入三个整数,以逗号分隔:')
list_data = list(map(int,list_data.split(',')))  # map返回迭代器,使用list()可获取其列表,
print(sorted(list_data))

# 2.by_nico 分三次输入
list_data = []
for i in range(1,4):
    a = int(input('请输入第%d个整数'% i))
    list_data.append(a)
sorted(list_data)  # 返回的是新列表,不回改变原有列表的值

# 补充1:
# list_data.sort() # 如果使用列表的sort方法,没有返回值,改变原有的列表。
# print(list_data)
# 补充2:
# 使用map将列表中的元素转换为int类型的时候也可以使用列表生成式
# li2 = [int(i) for i in li]

  1. 将一个列表的数据复制到另一个列表中。

    这题很简单,但是在这基础上可以扩展直接赋值、浅拷贝、深拷贝的知识

# by_nico 赋值、浅拷贝、深拷贝
from copy import deepcopy
list_a = [23,345,78,'host',89,['no1','no2']]
list_b = list_a
list_c = list_a.copy()
list_d = deepcopy(list_a)

# 更改 最浅层
list_a[0] = 999
print(list_a)  # 已改变 [999, 345, 78, 'host', 89, ['no1', 'no2']]
print(list_b)  # 已改变
print(list_c)  # 不变
print(list_d)  # 不变

# 更改 深层
list_a[5].append("c")
print(list_a)  # 已改变 [999, 345, 78, 'host', 89, ['no1', 'no2', 'c']]
print(list_b)  # 已改变
print(list_c)  # 已改变
print(list_d)  # 不变
  1. 输出9*9乘法表
# by_nico
for i in range(1,10):
    for j in range(1,i+1):
        print('%d*%d=%d'% (i,j,i*j),end = '\t') # end也可以用' ',使用'\t'能保证列对齐
    print('')  # 代表换行 
# 结果
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	
  1. 暂停1秒输出。
# by_nico
import time

li=[1,2,3,4]
for i in li:
    print(i)
    time.sleep(1)  # 暂停一秒输出
  1. 暂停一秒输出,并格式化当前时间。
# 看到第十题才发现第9题我已经用这种方法实现了,只有把它拷贝下来
# by_nico
import time

print(time.strftime("%Y-%m-%d %X",time.localtime()))
time.sleep(1)    # 暂停一秒输出
print(time.strftime("%Y-%m-%d %X",time.localtime()))
posted @ 2020-05-13 11:40  nico_co  阅读(262)  评论(0)    收藏  举报