【蓝桥杯简单篇】Python组刷题日寄Part01

刷题日记?刷题日寄!
萌新备战蓝桥杯python组
🌹 发现有需要纠正的地方,烦请指正!
🚀 欢迎小伙伴们的三连+关注!

往期系列:
【蓝桥杯入门篇】Python组刷题日寄Part01

【蓝桥杯入门篇】Python组刷题日寄Part02

【蓝桥杯入门篇】Python组刷题日寄Part03

【蓝桥杯入门篇】Python组刷题日寄Part04

【蓝桥杯入门篇】Python组刷题日寄Part05

简单篇01

第01题:母牛的故事

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入描述:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。
输出描述:
对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。
样例输入:
2
4
5
0
样例输出:
2
4
6


答案:

分析:
前3年奶牛数量为:1,2,3
从第4年开始:当前年份奶牛数量 = 前一年奶牛数量 + 新出生奶牛数量
而新出生奶牛数量满足:新出生奶牛数量 = 3年前奶牛数量
因此:当前年份奶牛数量 = 前一年奶牛数量 + 3年前奶牛数量

def main():
    list = []       # 定义列表
    list.append(0)  # 往list添加初始数据
    list.append(1)  # 第一年奶牛数量为1
    list.append(2)  # 第一年奶牛数量为2
    list.append(3)  # 第一年奶牛数量为3
    for i in range(4, 55):  # 预处理前55年的奶牛数量
        list.append(list[i - 1] + list[i - 3])
    while True:
        n = int(input())    # 化为整型
        if n == 0:          # n == 0 时退出
            break
        print(list[n])      # 直接输出

if __name__ == '__main__':
   main()

第02题:字符逆序

题目:
时间限制:
1s
内存限制:
64MB
题目描述:
将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
输入描述:
输入包括一行。 第一行输入的字符串。
输出描述:
输出转换好的逆序字符串。
样例输入:
I am a student
样例输出:
tneduts a ma I


答案:

分析:
直接运用python字符串切片功能进行反转

def main():
    x = input("")
    x = x[::-1]     # 列表切片,逆序输出
    print(x)

if __name__ == '__main__':
   main()

第03题:用筛选法求之N内的素数

题目:
时间限制:
1s
内存限制:
64MB
题目描述:
用筛选法求之N内的素数。
输入描述:
N
输出描述:
0~N的素数
样例输入:
10
样例输出:
2
3
5
7


答案:

分析:
素数即为除1与其本身外,无法被整除的数。
我们可以借助嵌套循环的方式来筛选。
即第一层循环取假定的素数值 i,第二次循环取 2 到 i 之间数值 j,来判断 i % j 是否为0。
若为0,则break循环;不为0,继续直至所有 i 的取值全判断完。

def main():
    n = int(input())
    for i in range(2, n):
        for j in range(2, i):
            if i % j == 0:
                break
        else:
            print(i)

if __name__ == '__main__':
   main()

第04题:回文数字

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。
本题要求你找到一些5位或6位的十进制数字。满足如下要求:
该数字的各个数位之和等于输入的整数。
输入描述:
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出描述:
若干行,每行包含一个满足要求的5位或6位整数。
数字按从小到大的顺序排列。
如果没有满足条件的,输出:-1 .
样例输入:
44
样例输出:
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499


答案:

分析:
本题我们可以从数位来判断,分两种情况:
五位数:设个位和万位的数为 i;十位和千位的数为 j;百位为k——ijkji。从k入手判断。
五位数:设个位和十万位的数为 i;十位和万位的数为 j;百位和千位为k——ijkkji。从k入手判断。

def main():
    n = int(input())
    flag = False
    for i in range(1, 10):
        for j in range(0, 10):
            k = n - 2 * i - 2 * j
            if k >= 0 and k < 10:
                print(i * 10000 + j * 1000 + k * 100 + j * 10 + i)
                flag = True

    for i in range(1, 10):
        for j in range(0, 10):
            k = n - 2 * i - 2 * j
            if (k % 2 == 0 and k // 2 < 10) and k // 2 >= 0:
                print(i * 100000 + j * 10000 + (k // 2) * 1000 + (k // 2) * 100 + j * 10 + i)
                flag = True
                
    if flag == False:
        print(-1)

if __name__ == '__main__':
   main()

第05题:分糖果

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:
每个小朋友都把自己的糖果分一半给左手边的孩子。
(不妨假设:2号给1号,3号给2号,以此类推)
一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。
反复进行这个游戏,直到所有小朋友的糖果数都相同为止。
你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。
输入描述:
程序首先读入一个整数N(2< N< 100),表示小朋友的人数。
接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)
输出描述:
要求程序输出一个整数,表示老师需要补发的糖果数。
样例输入:
3
2 2 4
样例输出:
4


答案:

分析:
这道题目要注意一个问题,我们可以使用列表来存储数据,那么当小朋友交换糖果的时候,首尾的数据传递是关键。
首先定义一个n来表示小朋友数。
suger来定义一组输入,存储发放的糖果数。
定义一个变量来存储老师要发放的糖果数量。
通过一个while循环,判断结束的条件为suger内的元素都相等。
循环体内首先通过一层for循环把小朋友的糖果数量都减半。
然后再通过一层循环来完成小朋友糖果的传递。
注意首尾即可。
最后再通过一层循环完成老师发放糖果。

def main():
   n = int(input())
   suger = list(map(int, input().split()))
   give = 0		# 给出的糖果
   while True:
      for i in range(n):
         suger[i] /= 2		# 都先拿出一半
      for i in range(n):	# 获得别人给出的糖果
         if i == 0:
            number = suger[n - 1]
            suger[n - 1] += suger[0]
         elif i == n - 1:
            suger[i - 1] += number
         else:
            suger[i - 1] += suger[i]
      for i in range(n):	# 不是偶数,给出一颗
         if suger[i] % 2 != 0:
            suger[i] += 1
            give += 1
      # 用集合判断
      # 集合中不允许出现重复元素,因此糖果数全部相同时集合中只有一个元素
      s = len(set(suger))  
      if s <= 1:
         break
   # 最终输出给出的数量give    
   print(give, end='')

if __name__ == '__main__':
   main()


第06题:取模

题目:
时间限制:
1s
内存限制:
256MB
题目描述:
给定 n, m ,问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x = n mod y
输入描述:
输入包含多组独立的询问。
第一行包含一个整数 T 表示询问的组数。
接下来 T 行每行包含两个整数 n, m,用一个空格分隔,表示一组询问。
输出描述:
输出 T 行,每行依次对应一组询问的结果。如果存在,输出单词 Yes;如果不存在,输出单词 No。
样例输入:
3
1 2
5 2
999 99
样例输出:
No
No
Yes


答案:

分析:

def main():
   num = int(input())
   for i in range(num):
      n, m = map(int, input().split())
      key = 1
      for x in range(1, m):
         for y in range(x + 1, m + 1):
            if n % x == n % y:
               print('Yes')
               key = 0
               break
         if key == 0:
            break
      if key == 1:
         print('No')

if __name__ == '__main__':
   main()

第07题:打印十字图

题目:
时间限制:
1s
内存限制:
256MB
题目描述:
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示:请仔细观察样例,尤其要注意句点的数量和输出位置。
输入描述:
一个正整数 n (n< 30) 表示要求打印图形的层数。
输出描述:
对应包围层数的该标志。
样例输入:
3
样例输出:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$.. 

答案:

分析:

def function(n):
    A = [['.' for j in range(5 + 4 * n)] for i in range(5 + 4 * n)]
    if n == 0:
        for i in range(5):
            A[2][i] = '$'
            A[i][2] = '$'

    for k in range(3):
        x = int((5 + 4 * n + 1) / 2) - 1
        y = int((5 + 4 * n + 1) / 2) - 1 - k
        A[x][y] = '$'

        xmove = x
        ymove = y
        for kk in range(n):
            xmove = xmove - 2
            ymove = ymove - 2
            A[xmove][ymove] = '$'

    for k in range(3):
        x = int((5 + 4 * n + 1) / 2) - 1 - k
        y = int((5 + 4 * n + 1) / 2) - 1
        A[x][y] = '$'

        xmove = x
        ymove = y
        for kk in range(n):
            xmove = xmove - 2
            ymove = ymove - 2
            A[xmove][ymove] = '$'

    for i in range(1, n + 1):
        num = 2 * i
        x = int((5 + 4 * n + 1) / 2) - 1 - 2 - num
        y = int((5 + 4 * n + 1) / 2) - 1

        xmove = x
        ymove = y
        for j in range(num):
            A[xmove][ymove] = '$'
            xmove = xmove
            ymove = ymove - 1

    for i in range(1, n + 1):
        num = 2 * i
        x = int((5 + 4 * n + 1) / 2) - 1
        y = int((5 + 4 * n + 1) / 2) - 1 - 2 - num

        xmove = x
        ymove = y
        for j in range(num):
            A[xmove][ymove] = '$'
            xmove = xmove - 1
            ymove = ymove

    for j in range(int((5 + 4 * n + 1) / 2)):
        for i in range(int((5 + 4 * n + 1) / 2) - 2, -1, -1):
            A[5 + 4 * n - 1 - i][j] = A[i][j]

    for i in range(5 + 4 * n):
        A[i][int((5 + 4 * n + 1) / 2):] = A[i][int((5 + 4 * n + 1) / 2) - 2::-1]

    for i in range(5 + 4 * n):
        for j in range(5 + 4 * n):
            print(A[i][j], end='')
        print()


if __name__ == '__main__':
    n = int(input())
    function(n)

第08题:数字游戏

题目:
时间限制:
1s
内存限制:
64MB
题目描述:
栋栋正在和同学们玩一个数字游戏。
游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈。栋栋首先说出数字1。接下来,坐在栋栋左手边的同学要说下一个数字2。再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4。下一个同学要往下数三个数,说7。依次类推。
为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数。例如,当k=13时,栋栋和同学们报出的前几个数依次为:
1, 2, 4, 7, 11, 3, 9, 3, 11, 7。
游戏进行了一会儿,栋栋想知道,到目前为止,他所有说出的数字的总和是多少。
样例说明
栋栋说出的数依次为1, 7, 9,和为17。
输入描述:
输入的第一行包含三个整数 n,k,T,其中 n 和 k 的意义如上面所述,T 表示到目前为止栋栋一共说出的数字个数。
数据规模和约定
1 < n,k,T < 1,000,000;
输出描述:
输出一行,包含一个整数,表示栋栋说出所有数的和。
样例输入:
3 13 3
样例输出:
17


答案:

分析:

def main():
    L = [int(i) for i in input().split()]
    n = L[0]
    k = L[1]
    t = L[2]
    s = [1 for i in range(t)]
    re = 0
    m = 0
    for j in range(1, n + 1):
        m += j
    for i in range(1, t):
        s[i] = (s[i - 1] + m + n * n * (i - 1)) % k
        re += s[i]
    print(re + 1)

if __name__ == '__main__':
   main()

第09题:蚂蚁感冒

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入描述:
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数 据代表的蚂蚁感冒了。
输出描述:
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入:
5
-10 8 -20 12 25
样例输出:
3


答案:

分析:

def main():
    n = int(input())
    s = t = 0
    ls = [int(i) for i in input().split()]
    k = abs(ls[0])
    for i in ls[1:]:
        if (0 < i < k):
            s += 1
        if (i < 0 and abs(i) > k):
            t += 1
    if ((ls[0] < 0 and s != 0) or (ls[0] > 0 and t != 0)):
        print(s + t + 1)
    else:
        print("1")

if __name__ == '__main__':
   main()

第10题:核桃的数量

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:

  1. 各组的核桃数量必须相同
  2. 各组内必须能平分核桃(当然是不能打碎的)
  3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)

输入描述:
输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b,c< 30)
输出描述:
输出一个正整数,表示每袋核桃的数量。
样例输入:
2 4 5
样例输出:
20


答案:

分析:
枚举出所有符合条件的值
找出最小值

def main():
    a, b, c = map(int, input().split())
    list = []
    if a < 30 and b < 30 and c < 30:
        sum = a * b * c
        for i in range(1, sum + 1):
            if i % a == 0 and i % b == 0 and i % c == 0:
                list.append(i)
    print(list[0])

if __name__ == '__main__':
   main()

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四口鲸鱼爱吃盐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值