第十三届蓝桥杯Python B组国赛题解(一)

简介: 第十三届蓝桥杯Python B组国赛题解

试题A:斐波那契与7


02e964996ab04aacbc822dae5d25b9a3.png题意分析

  • 题目中问有多少项个位是7,而能让个位发生变化的也只有个位相加减,所以只考虑个位就行,不用在考虑其他位,即结果只保留个位就行
    对于这种题,肯定有规律,我们只需要找到找个规律,题目差不多就解决了
f1 = 0
f2 = 1
f3 = 1
c = 0   # 统计出现的次数
for i in range(60):
    print(f3, end=' ')  # 斐波那契数列中的数字
    f3 = (f1+f2)%10
    if f3 ==7:
        c+=1
    f1 = f2
    f2 = f3
# 1 1 2 3 5 8 3 1 4 5 9 4 3 7 0 7 7 4 1 5 6 1 7 8 5 3 8 1 9 0 9 9 8 7 5 2 7 9 6 5 1 6 7 3 0 3 3 6 9 5 4 9 3 2 5 7 2 9 1 0
# 经过验证,60个一循环 每个循环里面有8个个位为7的数字
print()
print(c)
print(202202011200//60)  # 一共3370033520次循环
print((202202011200//60)*8) # 26960268160

答案:26960268160


试题 B: 小蓝做实验

390f214773f446d3b9a1e176905a457d.png

利用埃氏筛法解题,埃氏筛法的效率非常高 关于埃氏筛法看这个

答案:342693

# 运用埃氏筛法进行解题
# 因为只有少部分的数据大于10**8,将数据分为两部份,小于10**8的,大于10**8
f = open(r'primes.txt','r',encoding='utf-8')  
txt = f.read().split()         # 讲文件内的东西转化为列表 
arr1 = [int(i) for i in txt if len(i)<=8]  # 根据长度分,然后在转换为整型
arr2 = [int(i) for i in txt if len(i)>8]   # 长度为170,所以单独判断花费的时间并不长
# 先默认所有的都为质数(这部分可以看我质数筛的文章)
# 埃氏筛选法效率非常高2分42秒能够找出10*8以内的质数
nums = [True for i in range(10**8+1)] 
for i in tqdm(range(3,10**8+1)):
    if nums[i]:
        for j in range(i+i,10**8,i):
            nums[j] = False
c=0 # 记录次数
for i in arr1:  # 根据列表里面的值判断是否为质数
    if nums[i]:
        c+=1
for i in arr2:   # 对大于10**8的数进行判断
    for j in range(2,int(i**0.5)+1):  
            if i%j == 0:
                break
    else:
        c+=1
print(c)


试题 C: 取模

e783a2c0d59449b5aab8ea2aeb247032.png

# 暴力
t = int(input())
nums = []
for i in range(t):
    n,m = input().split()
    n = int(n)
    m = int(m)
    f = False
    for j in range(1,m+1):
        if f:
            break
        for k in range(j+1,m+1):
            if n%j==n%k:
                f = True
                nums.append('Yes')
                break
    else:
        nums.append('No')
for i in nums:
    print(i)


试题 D: 内存空间

08e8b689576144499f374b1c93414333.png

44adb1217dd74f2e9891b5ab62ddd721.png

6bc906ceb1e2459499e6bc74e49f5db6.png

思路

  • 观察题意我们可以根据每句的前几个字符进行分类,详细可以分为5类,我们对不同的类,进行不同的处理,具体的处理方法见代码
  • 占用空间的大小先用B为单位,最后再根据转换的规则转换成题目要求的形式
t = int(input())
zong = 0 # 总大小,单位B
for i in range(t):
    s_lst = input().split()
    if s_lst[0] == 'int':     # 根据不同的输入情况进行分类
        st1 = s_lst[1].split(',')
        zong+=len(st1)*4  
    elif s_lst[0] == 'long':
        st1 = s_lst[1].split(',')
        zong+=len(st1)*8 
    elif  s_lst[0] == 'String':
        st1 = s_lst[1].split(',')
        num = 0
        for item in st1:
            num+=len(item.split('=')[1])-2
        zong+=num-1
    elif s_lst[0] == 'int[]':
        num = 0
        for it in range(1,len(s_lst)):
            if 'long' in s_lst[it] and ';' not in s_lst[it]:
                num += int(s_lst[it][4:-1])
            elif 'long' in s_lst[it] and ';' in s_lst[it]:
                num += int(s_lst[it][4:-2])
        zong+=num*4
    elif  s_lst[0] == 'long[]':
        num = 0
        for it in range(1,len(s_lst)):
            if 'long' in s_lst[it] and ';' not in s_lst[it]:
                num += int(s_lst[it].split(',')[0][5:-1])
            elif 'long' in s_lst[it] and ';' in s_lst[it]:
                num += int(s_lst[it][5:-2])
        zong+=num*8
z = [0,0,0,0]   # B,KB,MB,GB 前的数值
for i in range(4):
    z[i]=zong%1024
    zong = zong//1024
    if zong <=0:
        break
result = ''
result_st = ['GB','MB','KB','B']
for i in range(1,len(z)+1):
    if z[4-i] != 0:
        result+=f'{z[4-i]}{result_st[i-1]}'
print(result)


试题 E: 近似 GCD

image.png

image.png

解题思路

  • 题目的意思就是求,数组A中的长度大于1的子数组,有多少个满足近似GCD的值为g
  • 本题主要采用的方法,双指针法
  • 算法主要分为两部分
  • 判断子数组是否满足条件,
  • 指针的移动几种情况
n,g = map(int,input().split())
nums = [int(i) for i in input().split()]
import math
l = 0
r = 2
c = 0
while r<=len(nums):
    arr = nums[l:r]
    flag = False
    for i in range(len(arr)):
        s = g
        for j in range(len(arr)):
            if i == j:  # 跳过本身,也就是相当于将本身修改为 g
                continue
            else:
                s = math.gcd(s,arr[j])   # 利用math库中的gcd方法求解质数
        if s == g:
            c += 1
            flag = True
            break
    if flag: 
        r+=1
    else:
        if r-l>3:  # 长度大于3  
            r-=1
            l+=1
        elif r-l==3:  # 长度等于3 
            l+=1
        else:         # 长度等于2
            r+=1
            l+=1



相关文章
|
3月前
|
索引 Python 容器
【备战蓝桥杯】探索Python内置标准库collections的使用
【备战蓝桥杯】探索Python内置标准库collections的使用
49 1
|
3月前
|
开发者 Python
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
33 1
|
3月前
|
算法 测试技术 编译器
蓝桥杯-02-python组考点与14届真题
蓝桥杯-02-python组考点与14届真题
|
3月前
|
Python
第十三届蓝桥杯B组python(试题A:排列字母)
第十三届蓝桥杯B组python(试题A:排列字母)
25 0
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第三期模拟赛 【python】(二)
第十四届蓝桥杯第三期模拟赛 【python】(二)
|
3月前
|
测试技术 Python
第十四届蓝桥杯第三期模拟赛 【python】(一)
第十四届蓝桥杯第三期模拟赛 【python】(一)
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第二期模拟赛 【python】
第十四届蓝桥杯第二期模拟赛 【python】
|
2月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
56 0
|
2月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
38 0
|
2月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
38 0