python 习题练习二


前言

今天我们接着练习,哈哈,做题之前就扯点一些无关的事,提一个问题:你们觉得游戏的退游正常吗
为什么这么问哈,因为昨天朋友突然问我原神为什么不玩了,我说我退游了,他就感慨了一些,说白瞎了你的账号,哈哈哈,那一瞬间就突然有点负罪感,感觉不该退游的,也许是兴趣散了,也许是过了那个阶段,也许是曾经一起玩的人都离开了,当然那个朋友也玩,只不过我们很少一起玩罢了,所以在很长的刷本中,我退游了。其他的游戏也差不多是这样。
我很难受,但是白瞎就白瞎了吧,哈哈哈,该离开也是要离开的。
好了,开始正经写题了哈。


1、正负交错数列前n项和

在这里插入图片描述
这道题,主要看式子的规律,分子的规律很好找,就是除了第一项,其他的就是从1开始递增,如:1,2,3,4,5 这样,分母的话,仔细看是前两项分母之和就是本次的分母值。
我这里先上自己写的。

n=eval(input())
s=0
a=1              #a为分子
b=2              #b为分母
t=1              #用来储存前两项的分母
flag=-1          #设置flag进行变号
while(n>1):      #因为从第二项开始,所以只要n减到1
    n=n-1
    s=s+flag*(a/b) #计算后n-1项,结果存入s
    k=b            #k记录这次的分母
    b=b+t          #更新这次的分母值,k变为记录上一次的分母值
    a=a+1
    flag=-flag
    t=k           #这里t变为k,b也就是在下次循环中的上一次分母,所以有b=b(前一项分母)+t(前两项分母)
print("{:.6f}".format(1+s))#加上第一项 1+s

然后看下答案的写法:

n = int(input())
result = 1                        # 首项的值,作为累加初值
sign = -1                         # 符号,第二项是负值,
previous, current = 1, 1          # 分母数字的初值,从第二项开始符合这个规律
for i in range(1, n):             # 从1到n-1遍历n-1次
	previous, current = current, previous + current  # 下一个数值是前面两个数的加和
	result = result + sign * i / current             # 注意分子是 i
	sign = -sign                                     # 改变正负号
print('{:.6f}'.format(result))

的确很简便,通过循环改变分子,然后分母只需要两个变量前后交替改变就可以做到正确赋值了。

2、十进制整数转二进制

在这里插入图片描述
这是一道简单的转进制的题,我们在c和c++中已经做过好多遍,这里提出来就是想复习一下python的进制转换的内置函数:

- 二进制:bin()
- 
- 八进制:oct()
- 
- 十进制:int()
- 
- 十六进制:hex()

所以这道题可以直接:

n=eval(input())
k=bin(n)
print(k[2:])

为什么要k[2:]截断一下呢,因为通过函数转换他会有两位进制标志如0x等,所以去掉前两位就可以了。

3、统计学生平均成绩与及格人数

在这里插入图片描述

score = list(map(int, input().split()))  # 通过map()和list()函数把用户输入转化成int列表
average = sum(score) / len(score)  # 用总和除以数量得到平均分
count = len(list(x for x in score if x >= 60))  # 通过列表推导式得到大于60分的列表然后用len()函数得到数量
print("average = {}".format(average))
print("count = {}".format(count))

这道题,我们主要学习的就是他的接受方式和一个列表推导式,
首先得了解,map()和input.split():

map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

input.split()函数是对输入的字符串进行按位分割,默认是空格。
list()函数就是将内容转化为列表形式。

对于列表表达式:
python 的列表表达式有以下两种写法:

[表达式 for 变量 in 列表]
[表达式 for 变量 in 列表 if 条件]

4、百钱买百鸡A

在这里插入图片描述

for cock in range(1, 101):                 # 公鸡数量不为0且小于或等于100
    for hen in range(1, 101):              # 母鸡数量不为0且小于或等于100
        for chicken in range(1, 101):   # 小鸡数量大于0小于等于100且是3的倍数
            if chicken % 3 == 0:
                if cock + hen + chicken == 100 and 5 * cock + 3 * hen + chicken // 3 == 100:
                    print(cock, hen, chicken)  # 遇到满足条件的数字组合就输出

5、今天是第几天

在这里插入图片描述
啧啧,这道题是用到了咱这篇文章的第三题的接受输入的方式,然后就是一个判断了:

def pd(n):
    if n%4==0 and n%100!=0 or n%400==0:
        return 1
    else :
        return 0
s=list(map(int,input().split("/")))
day=0
k=[31,28,31,30,31,30,31,31,30,31,30,31]
for i in range(s[1]-1):
    day=day+k[i]
day=day+s[2]
if pd(s[0]) and s[1]>2:
    day=day+1
print("{}年{}月{}日是{}年第{}天".format(s[0],s[1],s[2],s[0],day))

6、计算整数 n 的阶乘

在这里插入图片描述
这里注意类型的判断可以采用type函数来获取变量类型,然后使用math.factorial()计算阶乘

import math
n=eval(input())
if n>=0 and type(n)==int:
    print(math.factorial(n))
else:
    print("ERROR")

7、判断是否直角三角形

在这里插入图片描述
先判断是不是三角形,之后再判断是不是直角三角形

a=eval(input())
b=eval(input())
c=eval(input())
k=0
if a<b+c and b<a+c and c<a+b:
    k=1
if  pow(c,2)==pow(b,2)+pow(a,2) or pow(a,2)==pow(b,2)+pow(c,2) or pow(b,2)==pow(a,2)+pow(c,2):
    if k==1:
        print("YES")
    else:
        print("NO")
else:
    print("NO")

8、出租车计费

在这里插入图片描述

s,t=map(int,input().split(","))
h=0
if s<=3:
    h=h+13
elif s<=15:
    h=h+(s-3)*2.3+13
elif s>15:
    h=h+(15-3)*2.3+(s-15)*2.3*1.5+13
h=h+t
print(int(h))

9、一元二次方程求根

在这里插入图片描述

a = float(input())
b = float(input())
c = float(input())
delta = b * b - 4 * a * c
if a == 0 and b != 0:
    print('{:.2f}'.format(- c / b))
elif a == 0 and b == 0:
    print('Data error!')
elif delta < 0:
    print("该方程无实数解")
elif delta == 0:
    #print(round(-b  / (2 * a),2))
    print('{:.2f}'.format(-b  / (2 * a)))
else:
    x1 = (-b + delta ** 0.5) /( a * 2)
    x2 = (-b - delta ** 0.5) /(a * 2)
    if x1 < x2:
	    x1,x2=x2,x1
    #print(round(x1,2),round(x2,2))  # round()函数获得的浮点数会自动转为最短表示,例如round(3.10000, 2) 的结果是3.1,而不是3.10
    print('{:.2f} {:.2f}'.format(x1,x2))  

加粗样式print(round(x1,2),round(x2,2)) # round()函数获得的浮点数会自动转为最短表示,例如round(3.10000, 2) 的结果是3.1,而不是3.10,
这个题目套用一下高中的求根公式

10、个税计算器

s = float(input())
# 先判断输入是正数,然后根据输入的工资范围定税率和速算扣除数
if s < 0:
    print("error")
else:
    salary = s - 5000
    if salary <= 0:
        fee, num = 0, 0
    elif salary <= 3000:
        fee, num = 3, 0
    elif salary <= 12000:
        fee, num = 10, 210
    elif salary <= 25000:
        fee, num = 20, 1410
    elif salary <= 35000:
        fee, num = 25, 2660
    elif salary <= 55000:
        fee, num = 30, 4410
    elif salary <= 80000:
        fee, num = 35, 7160
    else:
        fee, num = 45, 15160
    tax = abs(salary * fee / 100 - num)
    print("应缴税款{:.2f}元,实发工资{:.2f}元。".format(tax, salary + 5000 - tax))

这里用了多重if,elif语句,有了很多分支,清楚结构之后就好做了

11、分期付款计算器

在这里插入图片描述
在这里插入图片描述
他有两种方式:AC和ACPI,其中AC是需要以一个列表形式输出,ACPI直接输出一个结果就行,这道题主要是要读懂题意,他AC模式,刚开始累计已还款本金是0,以后每期都要乘以期数,这样理解就可以做了。

price,month,mode,rate = float(input()),int(input()),input(),float(input())
if mode == 'AC':
    ls = []
    for i in range(month):
        repayment = price / month + (price - price / month * i) * rate
        ls.append(round(repayment,2))
    print(ls)
elif mode == 'ACPI':
    repayment = price * rate * (1 + rate) ** month /((1 + rate) ** month - 1)
    print(round(repayment,2))
else:
    print('还款方式输入错误')

12、字符大小写转换

在这里插入图片描述
哈哈哈,这里就用到python的函数了,str.islower()判断是不是小写,同样的str.isupper()判断是不是大写,然后str.upper()是转为大写,str.lower()是转为小写。

s = input()
for c in s:
    if c.islower():
        print(c.upper(), end='')
    elif c.isupper():
        print(c.lower(), end='')
    else:
        print(c, end='')

总结

判断类的问题审题要仔细,条件找全基本就可以做了

  • 14
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长街395

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值