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

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

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

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

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

简单篇04

第01题:阶乘

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
一个整数 n n n 的阶乘可以写成 n ! n! n!,它表示从 1 1 1 n n n n n n 个整数的乘积。阶乘的增长速度非常快,例如, 13 ! 13! 13! 就已经比较大了,已经无法存放在一个整型变量中;而 35 ! 35! 35! 就更大了,它已经无法存放在一个浮点型变量中。因此,当 n n n 比较大时,去计算 n ! n! n! 是非常困难的。幸运的是,在本题中,我们的任务不是去计算 n ! n! n!,而是去计算 n ! n! n! 最右边的那个非 0 0 0 的数字是多少。例如, 5 ! = 1 ∗ 2 ∗ 3 ∗ 4 ∗ 5 = 120 5! = 1*2*3*4*5 = 120 5!=12345=120,因此 5 ! 5! 5! 最右边的那个非 0 0 0 的数字是 2 2 2。再如: 7 ! = 5040 7! = 5040 7!=5040,因此 7 ! 7! 7! 最右边的那个非 0 0 0 的数字是 4 4 4。请编写一个程序,输入一个整数 n ( n < = 100 ) n(n< =100) n(n<=100),然后输出 n ! n! n! 最右边的那个非 0 0 0 的数字是多少。
输入描述:
输入只有一个整数 n n n
输出描述:
输出只有一个整数,即 n ! n! n! 最右边的那个非 0 0 0 的数字。
样例输入:
6
样例输出:
2


答案:

分析:
见代码注释。

n = int(input())
def func(num):
    # 返回最右侧的非0值
    s = str(num)
    for i in s[::-1]:
        if i == '0':
            continue
        else:
            return int(i)

def main(n):
    dp = [1 for i in range(n)]
    for i in range(1, n):
        dp[i] = (i+1) * dp[i-1]

    return func(dp[-1])

if __name__ == '__main__':
    print(main(n))

第02题:阿尔法乘积

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
计算一个整数的阿尔法乘积。对于一个整数 x x x 来说,它的阿尔法乘积是这样来计算的:如果 x x x 是一个个位数,那么它的阿尔法乘积就是它本身;否则的话, x x x 的阿尔法乘积就等于它的各位非 0 0 0 的数字相乘所得到的那个整数的阿尔法乘积。例如: 4018224312 4018224312 4018224312 的阿尔法乘积等于 8 8 8,它是按照以下的步骤来计算的:
4018224312 → 4 ∗ 1 ∗ 8 ∗ 2 ∗ 2 ∗ 4 ∗ 3 ∗ 1 ∗ 2 → 3072 → 3 ∗ 7 ∗ 2 → 42 → 4 ∗ 2 → 8 4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8 4018224312418224312307237242428
编写一个程序,输入一个正整数(该整数不会超过6,000,000),输出它的阿尔法乘积。
输入描述:
输入只有一行,即一个正整数。
输出描述:
输出相应的阿尔法乘积。
样例输入:
4018224312
样例输出:
8


答案:

分析:
略。

n = input().strip()
while len(n)>1:
    out = 1
    for i in n:
        if i != '0':
            out *= int(i)
    n = str(out)

print(n)

第03题:集合运算

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
给出两个整数集合 A , B A, B A,B,求出他们的交集、并集以及 B B B A A A 中的余集。
输入描述:
第一行为一个整数 n n n,表示集合 A A A 中的元素个数。
第二行有 n n n 个互不相同的用空格隔开的整数,表示集合 A A A 中的元素。
第三行为一个整数 m m m,表示集合 B B B中的元素个数。
第四行有 m m m 个互不相同的用空格隔开的整数,表示集合 B B B 中的元素。
集合中的所有元素均为 i n t int int 范围内的整数, n , m < = 1000 n, m< =1000 n,m<=1000
输出描述:
第一行按从小到大的顺序输出 A , B A, B A,B交集中的所有元素。
第二行按从小到大的顺序输出 A , B A, B A,B并集中的所有元素。
第三行按从小到大的顺序输出 B B B A A A 中的余集中的所有元素。
样例输入:
5
1 2 3 4 5
5
2 4 6 8 10
样例输出:
2 4
1 2 3 4 5 6 8 10
1 3 5


答案:

分析:
集合的按位运算 & 交,| 并,-

n_A = input()
A = set(map(int, input().split()))
n_B = input()
B = set(map(int, input().split()))
inter = sorted(list(A & B))
union = sorted(list(A | B))
diff = sorted(list(A - B))

print(' '.join(list(map(str, inter))))
print(' '.join(list(map(str, union))))
print(' '.join(list(map(str, diff))))

第04题:黑色星期五

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:
(1) 一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;
(2) 已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
输入描述:
输入只有一行,即某个特定的年份(大于或等于1998年)。
输出描述:
输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。
样例输入:
1998
样例输出:
3


答案:

分析:
本题给出两种解法,一种是利用Python自带的 calendar 库,另一种则不利用。

"""
方法一:使用calender库
利用calender.monthrange(year, month)函数
year, month 分别为 某年,某月;
该函数返回一个元组 (weekday, days of month):
其中 weekday 为该月的第一天为周几 (0-6分别代表周一到周日),days of month 为该月有几天
"""
import calendar as cld
year = int(input())
num = 0
for i in range(1, 13):
    if (cld.monthrange(year, i)[0]+13)%7 == 5:
        num += 1
print(num)
"""
方法二:不使用calendar库
"""
year = int(input())
def Leap(year):
    # 判断是否为闰年
    if year%4 == 0 and year%100 != 0 or year%400 == 0:
        return True
    else:
        return False

days = 0    # 从 1998.1.1 到 (year-1).12.31 有多少天
for i in range(1998, year):
    if Leap(i):
        # 闰年
        days += 366
    else:
        # 平年
        days += 365

month_leap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
mont_common = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

num = 0     # 计该年13号且为周五的天数
if Leap(year):
    # 如果是闰年
    for i in month_leap:
        # 逐月判断
        if (days+13-4)%7 == 5:  # 这里减4是因为1998.1.1是周四
            num += 1
        days += i
else:
    # 平年
    for i in mont_common:
        # 逐月判断
        if (days+13-4)%7 == 5:  # 这里减4是因为1998.1.1是周四
            num += 1
        days += i
print(num)


第05题:传球游戏

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。
游戏规则是这样的: n n n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。
聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了 m m m 次以后,又回到小蛮手里。两种传球的方法被视作不同的方法,当且仅当这两种方法中,接到球的同学按接球顺序组成的序列是不同的。比如有 3 3 3 个同学 1 1 1 号、 2 2 2 号、 3 3 3 号,并假设小蛮为 1 1 1 号,球传了3次回到小蛮手里的方式有 1 → 2 → 3 → 1 1\rightarrow 2\rightarrow 3\rightarrow1 1231 1 → 3 → 2 → 1 1\rightarrow 3\rightarrow 2\rightarrow 1 1321,共2种。
输入描述:
共一行,有两个用空格隔开的整数n,m(3<=n<=30,1<=m<=30)。
数据规模和约定
100%的数据满足:3<=n<=30,1<=m<=30
输出描述:
t 共一行,有一个整数,表示符合题意的方法数。
样例输入:
3 3
样例输出:
2


答案:

分析:
利用动态规划,分析具体见代码注释

n, m = map(int, input().split())
# n>=3, m>=1
dp = [[0 for j in range(n)] for i in range(m)]
# dp为m*n维
# dp[i][j]表示经过(i+1)次传球,(j+1)号同学拿到球的最大可能次数

dp[0][1] = 1
dp[0][n-1] = 1
# 当传球1次时,2号同学和n号同学拿到球的最大可能次数都为1

for i in range(1, m):
    for j in range(n):
        # 每个同学都可以从左手或右手边的同学获得球
        if j == (n-1):
            # 第n名同学
            dp[i][j] = dp[i-1][0] + dp[i-1][j-1]
        else:
            # 其他同学
            dp[i][j] = dp[i-1][j+1] + dp[i-1][j-1]
print(dp[-1][0])

第06题:s01串

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
s01串初始为" 0"
按以下方式变换
0变1,1变01
输入描述:
1个整数(0~19)
输出描述:
n次变换后s01串
样例输入:
3
样例输出:
101


答案:

分析:
利用字符串的 translate() 方法。

n = int(input())
s = '0'
remap = {ord('0'): '1', ord('1'): '01'}
for i in range(n):
    s = s.translate(remap)
print(s)

第07题:质因数

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
将一个正整数 N ( 1 < N < 32768 ) N(1< N< 32768) N(1<N<32768)分解质因数。例如,输入90,打印出 90 = 2 ∗ 3 ∗ 3 ∗ 5 90=2*3*3*5 90=2335.
输入描述:

输出描述:

样例输入:
66 66 66
样例输出:
66 = 2 ∗ 3 ∗ 11 66=2*3*11 66=2311


答案:

分析:
方法1:首先要定义一个函数来判断一个数是否为质数,之后循环找质因数,最后用 join() 方法输出。
方法2:用 while 语句省去判断是否为质数的过程。

## 方法1
def isprime(num):
    for i in range(2, num):
        if num%i == 0:
            return False
    return True

n = int(input())
s = str(n)+'='
lis = []
while n>1:
    for i in range(2, n+1):
        if n%i == 0 and isprime(i):
            lis.append(str(i))
            n //= i
            break

print(s+'*'.join(lis))
## 方法2
n = int(input())
s = str(n)+'='
lis = []
for i in range(2, n+1):
    while n%i == 0:
        lis.append(str(i))
        n = n//i

print(s+'*'.join(lis))

第08题:最小绝对值

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
输入10个数,找出其中绝对值最小的数,将它和最后一个数交换,然后输出这10个数。
输入描述:
十个数
输出描述:
交换后的十个数
样例输入:
10 2 30 40 50 60 70 80 90 100
样例输出:
10 100 30 40 50 60 70 80 90 2


答案:

分析:
map()函数,abs()函数,list.index()函数

lis = list(map(int, input().split()))
abs_lis = [abs(i) for i in lis]
ind = abs_lis.index(min(abs_lis))
temp = lis[ind]
lis[ind] = lis[-1]
lis[-1] = temp
lis = map(str, lis)
print(' '.join(lis))

第09题:进制转换

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
编程,输入一个10进制正整数,然后输出它所对应的八进制数。
输入描述:
一个10进制数
输出描述:
对应8进制数
样例输入:
10
样例输出:
12


答案:

分析:
format格式化输出,b o d x 分别表示二、八、十、十六进制

n = int(input())
print('{:o}'.format(n))

第10题:阶乘数列

题目:
时间限制:
1s
内存限制:
128MB
题目描述:
1 + 2 ! + 3 ! + 4 ! + … + 30 ! 1+2!+3!+4!+…+30! 1+2!+3!+4!++30!
科学计数法,保留两位小数。
输入描述:

输出描述:
科学计数法,保留两位小数。
样例输入:

样例输出:


答案:

分析:
格式化输出

def func(n):
    if n==1:
        return 1
    else:
        return n*func(n-1)
sum = 0
for i in range(1, 31):
    sum += func(i)
print('%.2e' % sum)

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四口鲸鱼爱吃盐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值