蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦

蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦,第1张

蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦

第一题:门牌制作

解答:作为填空题第一题,难度比较低,暴力查2即可。

cnt = 0
for i in range(1,2021):
    for j in str(i):
        if j == '2':
            cnt = cnt + 1

print(cnt)  # 624

第二题:既约分数

 

 题解:这个题我想到的办法就是暴力解决,生成1到2020的分母和1到2020的分子,看一看是不是最大公约数是不是为1,然后利用python本地库fraction进行分数相似性判断(看看是不是分数相等)。需要注意的是,暴力法python计算很慢。(反正是填空题,咱们先做下一道)

from fractions import Fraction


def gong_yue(m, n):
    if m > n:
        sm = n
    else:
        sm = m
    for i in range(1, sm + 1):
        if m % i == 0 and n % i == 0:
            hcf = i
    return hcf


target_lst = []
for i in range(1, 2021):
    for j in range(1, 2021):
        if gong_yue(i, j) == 1 and Fraction(i, j) not in target_lst:
            target_lst.append(Fraction(i, j))
print(len(target_lst))

实在想不起来python这个本地库的内容了,在idle上按F1打开帮助文档救急

第三题:蛇形填数

 题解:我们不难看出1行1列数在1这个数组中,第2行第2列的数在第456数组中的中间位置,第三行第三列在11,12,13,14,15这个数组中的中间位置。我们按条斜线为一个数组,不难看出第n行n列就在等差数列数组1,3,5,7~~~中,即为第39个数组,我们先生成一个类似于[[1],[2,3],[4,5,6],[7,8,9,10]~~~]这样的形式代表一条斜线上的数字,第39条斜线数组即为位置为38位置的数组(从0开始算),这个数组内元素个数一定为奇数为29,那中间的位置为第15号(即为14号位置的元素),后边比较坑。

cnt = 1
num = 0
all_lst = []
lst = []
for i in range(1, 10000):
    lst.append(i)
    num = num + 1
    if cnt == num:
        all_lst.append(lst)
        lst = []
        cnt = cnt + 1
        num = 0
# 20行20列对应在第39次循环中
print(all_lst[38][14])
# 756

第四题:跑步训练

 题解:这个题我做起来比较麻烦,要时刻不断地维护四个变量月中第n天,月份,星期,年。关系比较复杂,中间还穿插有闰年等东西,做题是要集中注意力,理清楚几个变量之间的关系,有个小技巧就是在运行工程中穿插print函数打印当前的一些数据,我们便能够轻松观察到问题出现在哪个地方,便可以快速解决。还有,在已经写完的代码上加上注释,看似麻烦其实大大减轻了我们的思考强度。

def run(n):
    if n % 4 == 0:
        return True
    else:
        return False


run_day = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
ping_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
start_year = 2000  # 记录年份
cnt_mon = 0  # 记录年中第几月
month_day = 1  # 记录月中第几天
cnt = 6  # 记录星期几
distance = 0  # 记录距离
while True:
    if cnt == 1 or month_day == 1:  # 判断当前距离
        distance = distance + 2
    else:
        distance = distance + 1
    if start_year == 2020 and cnt_mon == 9 and month_day == 1:
        break
    if cnt == 7:  # 判断星期,进行星期迭代
        cnt = 1
    else:
        cnt = cnt + 1
    if run(start_year):
        if month_day == run_day[cnt_mon]:  # 闰年月份增加
            month_day = 1
            cnt_mon = cnt_mon + 1
        else:  # 闰年日期增加
            month_day = month_day + 1
    else:
        if month_day == ping_day[cnt_mon]:  # 平年月份增加
            month_day = 1
            cnt_mon = cnt_mon + 1
        else:  # 平年日期增加
            month_day = month_day + 1
    if cnt_mon == 12:  # 年份增加
        start_year = start_year + 1
        cnt_mon = 0
print(distance)  # 8879

第五题:七段码

题解:啊这个,还没学过。感觉有点像回溯。

第六题: 成绩统计

 

 题解:这道题比较简单没什么说的

num = int(input())
chengji_lst = []

good = 0
normal = 0
for i in range(num):
    c = int(input())
    if c >= 85:
        good = good + 1
    if c >= 60:
        normal = normal + 1
normal_range = normal / num * 100
good_range = good / num * 100
a = normal_range - int(normal_range)
b = good_range - int(good_range)
if a >= 0.5:
    normal_range = int(normal_range) + 1
else:
    normal_range = int(normal_range)
if b >= 0.5:
    good_range = int(good_range) + 1
else:
    good_range = int(good_range)
print(str(normal_range) + '%')
print(str(good_range) + '%')

第七题:回文日期

 

解题思路:这个题我认为跟上边的跑步锻炼那个题差不多,部分代码复制一下就可以解决这个问题

def run(n):
    if n % 4 == 0:
        return True
    else:
        return False


run_day = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
ping_day = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

data = input()
year = int(data[0:4])
month = int(data[4:6])
day = int(data[6:])
status = []
hashmap = {}
while True:
    if run(year):
        if day == run_day[month - 1]:
            day = 1
            month = month + 1
        else:
            day = day + 1
    else:
        if day == ping_day[month - 1]:
            day = 1
            month = month + 1
        else:
            day = day + 1
    if month == 13:
        year = year + 1
        month = 1
    str_month = str(month)
    str_day = str(day)
    if len(str(month)) == 1:
        str_month = '0' + str(month)
    if len(str(day)) == 1:
        str_day = '0' + str(day)
    ge_shi = str(year) + str_month + str_day
    if ge_shi == ge_shi[::-1]:
        if 'a' not in status:
            hashmap['normal'] = ge_shi
            status.append('a')
        if ge_shi[0:2] == ge_shi[2:4] and ge_shi[7:5:-1] == ge_shi[5:3:-1] and ge_shi[0:2] == ge_shi[7:5:-1]:
            hashmap['ab'] = ge_shi
            break
print(hashmap['normal'])
print(hashmap['ab'])

 第八题:子串分值和

 题解:利用集合的特性

a = input()
long = len(a)
head = 0
tail = 1
s = 0
while True:
    s = len(set(a[head:tail])) + s
    if tail == long:
        head = head + 1
        tail = head + 1
    else:
        tail = tail + 1
    if head == long:
        break

print(s)

第九题:平面切分

 

 后边这两道实在做不出来

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5713970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存