当前位置:首页 » 《关注互联网》 » 正文

第十六届蓝桥杯电子赛模拟赛python组第一期题解

10 人参与  2024年12月15日 14:01  分类 : 《关注互联网》  评论

点击全文阅读


1.质因数

【问题描述】
如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。
请问 2024 有多少个质因数。

我们先来看看质数和约数的定义:

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。例如:
2 是最小的质数,它只能被 1 和 2 整除。
3 也是质数,只能被 1 和 3 整除。
4 不是质数,因为它可以被 1, 2 和 4 整除。
判断一个数是否为质数的方法通常包括试除法,即用小于该数的所有自然数(从2开始)去除这个数,如果都不能整除,则该数为质数

约数是指能整除给定正整数的数。具体来说:
- 如果整数 `a` 能够被整数 `b` 整除(即 `a % b == 0`),那么 `b` 就是 `a` 的一个约数。
- 例如,12 的约数有 1, 2, 3, 4, 6, 12。
每个正整数都有至少两个约数:1 和它本身。如果一个数只有这两个约数,那么它就是质数。

res = 0for i in range(2, 2025):    flag = 1    if 2024 % i == 0:        for j in range(2, i-1):            if i % j == 0:                flag = 0                break        if flag == 1:            print(i)            res += 1print(res)

答案:

2.开根变换数

对于一个整数 n ,我们定义一次开根变换会将 n 变为开根号后的整数部分。即变为平方和不超过 n 的数中的最大数。
例如,20 经过开根变换将变为 4 ,如果再经过一次开根变换将变为 2 ,如果再经过一次开根变换将变为 1 。
请问,2024经过多少次开根变换后会变为 1 ?

用math库中 的sqrt方法就可以了

import mathx = int(math.sqrt(2024))res = 1while x != 1:    res += 1    x = int(math.sqrt(x))print(res)

答案:

3.立方体

【问题描述】
小蓝有很多 1x1x1 的小立方体,他可以使用多个立方体拼成更大的立方体。
例如,小蓝可以使用 8 个小立方体拼成一个大立方体,每边都是 2 个。
又如,小蓝可以使用 27 个小立方体拼成一个大立方体,每边都是 3 个。
现在,小蓝有 2024 个小立方体,他想再购买一些小立方体,用于拼一个超大的立方体,要求所有的小立方体都用上,拼成的大立方体每边长度都相等。
请问,小蓝最少需要购买多少个小立方体?

找到第一个3次方后大于2024的数,再减去2024就是答案了

n = 0for i in range(1,50):    if i ** 3 >= 2024:        print(i)        breakres = 13 ** 3 - 2024print(res)

答案:

4.日期

【问题描述】
如果一个日期的日期以 1 结尾(1日、11日、21日、31日)且为星期一,则称这个日期为一好日期。
请问从 1901 年 1 月 1 日至 2024 年 12 月 31 日总共有多少个一好日期。
提示:1901 年 1 月 1 日是星期二。

这道题要对python自带的datetime库熟悉

from datetime import datetime, timedeltastart = datetime(1901, 1, 1)end = datetime(2024, 12, 31)def is_one_day(start):    return start.day % 10 == 1 and start.weekday() == 0def count_one_day(start,end):    count = 0    while start <= end :        if is_one_day(start):            count += 1        start = start + timedelta(days=1)    return countprint(count_one_day(start,end))

答案:

5.异或平方和

【问题描述】
两个数按位异或是指将这两个数转换成二进制后,最低位与最低位异或作为结果的最低位,次低位与次低位异或作为结果的次低位,以此类推。
例如,3 与 5 按位异或值为 6 。
小蓝有以下 30 个整数:
9226, 4690, 4873, 1285, 4624, 1596, 6982, 590, 8806, 121, 8399, 8526, 5426, 64, 9655, 7705, 3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325, 1226, 8203, 9524, 3648, 5278, 8647.
小蓝想找一个整数 V ,使得 V 与这 30 个数分别异或后,得到的 30 个数的平方和最小。请问平方和最小是多少?

先把最小平方和变成最大值,了解异或操作符就不难理解

numbers = [    9226, 4690, 4873, 1285, 4624, 1596, 6982, 590,    8806, 121, 8399, 8526, 5426, 64, 9655, 7705,    3929, 3588, 7397, 8020, 1311, 5676, 3469, 2325,    1226, 8203, 9524, 3648, 5278, 8647]smin=float('inf')#初始化和为无穷大best_v=0for v in range(max(numbers)+1):    s=sum((num ^ v) ** 2 for num in numbers)#异或运算‘^’    if s<smin:        smin=s        best_v=vprint("最小平方和:", smin)print("最佳V值:", best_v)

答案:

6.停车场

【问题描述】
小蓝在一个停车场停车。
停车场的收费规则为:每 15 分钟收费 2 元,不满 15 分钟的不收费。
小蓝总共停车 n 分钟,请问收费总额是多少?

【输入格式】
输入一行包含一个整数 n ,表示小蓝停车的时长。

【输出格式】
输出一行包含一个整数,表示停车费用。

送分题

n = int(input('请输入停车时间:'))def frees(n):    free = n // 15 * 2    return freeprint(frees(n))

7.非零位

【问题描述】
小蓝有一个整数 n ,每次操作,可以将这个整数的每个非零数位减少 1 。
请问经过多少次操作,这个数会变为 0 。
例如,整数 2024 经过一次操作变为 1013,再经过一次操作变为 2 (即0002),再经过两次操作变为 0 ,总共经过 4 次变换变为 0 。

【输入格式】
输入一行包含一个整数 n 。

【输出格式】
输出一行,包含一个整数,表示答案。

只用注意最大的数是几就行了

num = int(input('请输入一个整数:'))def max_num(num):    j = 0    for i in str(num)[0:]:        if int(i) > j:            j = int(i)    return jprint(max_num(num))

8.减法式子

【问题描述】
小蓝有一个减法式子,形如 a-b,其中 a 和 b 都是非负整数(不保证结果非负)。
请编程处理这个式子,输出运算结果。

【输入格式】
输入一行包含一个减法表达式,式子中仅含数字字符和一个减号。

【输出格式】
输出一行包含一个整数,表示运算结果。

找“-”的位置就好了

dec = input('请输入一个减法式子;')def find_num(dec):    for i in range(len(dec)):        if dec[i] == '-':            return [dec[0:i], dec[i+1:len(dec)]]def sub(dec):    dec1 , dec2 = find_num(dec)    return int(dec1) - int(dec2)print(sub(dec))

9.间隔和最大

【问题描述】
小蓝有一个长度为 n 的整数数列 a[1], a[2], ..., a[n] 。
对于一个给点的整数 k ,小蓝想找到相邻间隔为 1 的 k 个数 a[p], a[p+2], a[p+4], ..., a[p+2k-2],使得他们的和最大。其中 1 <= p <= n-2k+2。
给定数列 和 k ,请问给出最大的和。

【输入格式】
输入的第一行包含一个整数 n 。
第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。
第三行包含一个整数 k 。

【输出格式】
输出一行,包含一个整数,表示答案。

暴力解法

n = int(input("请输入数组长度:"))array = list(map(int, input("请输入一维数组,元素之间用空格分隔:").split()))k = int(input("相邻间隔为 1 的 k 个数:"))if n != len(array):    print("输入的数组长度与输入的长度不匹配,请重新输入")    exit()else:    def max_interval_sum(array, k):        max_sum = float('-inf')        for p in range(0, n-2*k+1):            current_sum = sum(array[p + 2 * i] for i in range(k))            if current_sum > max_sum:                max_sum = current_sum        return max_sum    print(max_interval_sum(array, k))

10.√

【问题描述】
小蓝有一个长度为 n 的整数序列 a[1], a[2], ..., a[n] 。
他希望从中找出一个最长的子序列,形成一个勾的形状(√)。
即找到 1 <= p[1] < p[2] < ... < p[k] <= n,满足 a[p[1]] > a[p[2]] > a[p[3]] > ... > a[p[x]] < a[p[x+1]] < ... < a[p[k]] 。其中 k 是子序列的长度,x 是勾中最小的位置。目标是使得 k 最大。
请找出最大的勾的长度。

【输入格式】
输入的第一行包含一个整数 n 。
第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。

【输出格式】
输出一行,包含一个整数,表示答案。

一个增式,一个减式

n = int(input("请输入数组长度:"))a = list(map(int, input("请输入一维数组,元素之间用空格分隔:").split()))if n < 3:    print(0)else:    decreasing = [1] * n    increasing = [1] * n    # 计算每个位置之前的最长递减子序列    for i in range(n):        for j in range(i):            if a[j] > a[i]:                decreasing[i] = max(decreasing[i], decreasing[j] + 1)    # 计算每个位置之后的最长递增子序列    for i in range(n - 1, -1, -1):        for j in range(i + 1, n):            if a[j] > a[i]:                increasing[i] = max(increasing[i], increasing[j] + 1)    max_length = 0    for i in range(n):        if decreasing[i] > 1 and increasing[i] > 1:            max_length = max(max_length, decreasing[i] + increasing[i] - 1)    print(max_length)

如有问题,请联系我


点击全文阅读


本文链接:http://zhangshiyu.com/post/201618.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1