1. 统计成绩及格率和优秀率
题目描述
小L给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格;如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
输入描述
输入的第一行包含一个整数 n (1≤n≤10^4 ),表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
解题思路:
(1) 先用数组接收全部输入成绩
(2)用两个变量分别按条件判断和记录
(3)print输出合格率和优秀率
(4)技巧:百分比可以按照除法计算,int取整,输出百分号采用两个%%就可以
n = int(input("请输入录入的成绩数量"))
list_score = []
for i in range(n):
x = int(input("共%d个成绩,请输入第%d个成绩:" % (n, i + 1)))
list_score.append(x)
# 确认输入
# print(list_score)
# 统计及格数量以及优秀数量
n_jige=0
n_youxiu=0
for i in range(len(list_score)):
x=list_score[i]
if x>=60:
n_jige+=1
if x>=85:
n_youxiu+=1
# 完成统计,输出及格率和优秀率
p_jige=int(n_jige/n*100)
p_youxiu=int(n_youxiu/n*100)
print("%d%%"%(p_jige))
print("%d%%"%(p_youxiu))
2. 回文日期
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
解题思路:
(1)先用字符串接收输入日期,再用字符串切片,获得年月日
(2)用datetime.date转化为date类型
(3)做第一个子函数,判断是否为ABABBABA 型回文,这个比较容易判断,直接用if判断
(4)再做一个子函数,判断是否为回文,将原日期字符串切为两片,后一片用切片[::-1]倒过来,两者相等就是
(5)用循环方式每次加一天 in_date = in_date + datetime.timedelta(days=1),调用子函数判断是否ABABBABA 型和回文型
(6)判断时注意技巧,条件里要确认之前未找到,并且ABABBABA 型是一种特殊回文,理论上先找到ABABBABA 型则回文也找到了。
(7)print输出找到的回文和ABABBABA 型回文。
import datetime
# 获取输入的日期
str_date = input("请输入8位数字日期:")
y1 = str_date[0:4]
m1 = str_date[4:6]
d1 = str_date[6:8]
in_date = datetime.date(int(y1), int(m1), int(d1))
# 做两个函数判断回文类型
def Is_huiwen(s):
if len(s) != 8:
return False
# 回文即前4位==后4位颠倒
s2=s[4:8]
s3=s2[::-1]
if s[0:4] == s3:
return True
else:
return False
def Is_ABABBABA_huiwen(s):
if len(s) != 8:
return False
# ABABBABA
if s[0] == s[2] == s[5] == s[7] and s[1] == s[3] == s[4] == s[6]:
return True
else:
return False
# 循环获取下一个回文日期和ABABBABA型回文日期
find_huiwen = False
find_ABABBABA_huiwen = False
date_huiwen=""
date_ABABBABA_huiwen=""
while True:
x = in_date.strftime("%Y%m%d")
# print(x)
# ABABBABA 是一种特殊回文,因此也算找到回文
if not find_ABABBABA_huiwen and Is_ABABBABA_huiwen(x) :
find_ABABBABA_huiwen = True
date_ABABBABA_huiwen=x
if not find_huiwen:
find_huiwen = True
date_huiwen = x
if not find_huiwen and Is_huiwen(x) :
find_huiwen = True
date_huiwen=x
if find_ABABBABA_huiwen and find_huiwen:
break
else:
in_date = in_date + datetime.timedelta(days=1)
print(date_huiwen)
print(date_ABABBABA_huiwen)
3. 门牌号
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
解题思路:
(1) 循环获得从1到2020的数字转为字符串门牌
(2) 利用字符串的查找个数功能,找出每个门牌中2个个数n2
(3) 所有的n2累加就是总的门牌中2的个数和了。
n = 2020
num2 = 0
for i in range(n):
x = str(i + 1)
n2 = x.count('2')
num2 += n2
print(num2)
4. 购物单
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供 100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折
需要说明的是,88折指的是按标价的 88%计算,而 8 折是按 80% 计算,余者类推。 特别地,半价是按 50% 计算。
请输出小明要从取款机上提取的金额,单位是元。
解题思路:
(1) 用变量保存购物单
(2) 利用‘\n’换行符分割字符串变量获取第一个购物单列表
(3) 再将列表内的每一个字符串用split默认分割得到子数组
(4)子数组的第2位是购物金额,第3位是折扣需要做分支判断,累计得到总金额price1=5136.8595
(5)将总金额/100得到51.368595,利用math.ceil向上取整就得到52为需要的整百金额,因为只能多不能少
import math
# 用变量保存购物单
gouwudan='''**** 180.90 88折
**** 10.25 65折
**** 56.14 9折
**** 104.65 9折
**** 100.30 88折
**** 297.15 半价
**** 26.75 65折
**** 130.62 半价
**** 240.28 58折
**** 270.62 8折
**** 115.87 88折
**** 247.34 95折
**** 73.21 9折
**** 101.00 半价
**** 79.54 半价
**** 278.44 7折
**** 199.26 半价
**** 12.97 9折
**** 166.30 78折
**** 125.50 58折
**** 84.98 9折
**** 113.35 68折
**** 166.57 半价
**** 42.56 9折
**** 81.90 95折
**** 131.78 8折
**** 255.89 78折
**** 109.17 9折
**** 146.69 68折
**** 139.33 65折
**** 141.16 78折
**** 154.74 8折
**** 59.42 8折
**** 85.44 68折
**** 293.70 88折
**** 261.79 65折
**** 11.30 88折
**** 268.27 58折
**** 128.29 88折
**** 251.03 8折
**** 208.39 75折
**** 128.88 75折
**** 62.06 9折
**** 225.87 75折
**** 12.89 75折
**** 34.28 75折
**** 62.16 58折
**** 129.12 半价
**** 218.37 半价
**** 289.69 8折 '''
# 字符串处理购物单,以换行符\n分割,将其转换为一个列表,列表中每一个条目转为元组
# ['**** 180.90 88折', '**** 10.25 65折', '**** 56.14 9折']
list1=gouwudan.split('\n')
# print(list1)
# 再将每个列表元素用空格分割,转为如下的列表
# [[['****', '180.90', '88折'], ['****', '10.25', '65折']]
list2=[x.split() for x in list1]
# print(list2)
# 计算购物总额
price1=0
for x in list2:
p = float(x[1])
str_zk = x[2].strip()
if str_zk == '半价':
zk = 0.5
elif str_zk.find('折'):
# 如果折扣字符里有'折'就是数字折扣,把'折'去掉就是数字转为整数
# 整数在9以下就是除以10的折扣值,大于9则是两位数除以100就行了
str_zk = str_zk.replace('折', "")
zk = int(str_zk)
if zk <= 9:
zk = zk / 10
else:
zk = zk / 100
else:
zk = 1
p_zk = p * zk
price1 += p_zk
# 计算整百金额,先用ceil向上取整得到n100
n100=math.ceil(price1/100)
n_money=n100*100
print(n_money)