蓝桥杯Python初级测试题之省赛题1

蓝桥杯Python初级测试题之省赛题1

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)
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zeng31403

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

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

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

打赏作者

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

抵扣说明:

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

余额充值