刷题日记?刷题日寄!
萌新备战蓝桥杯python组
发现有需要纠正的地方,烦请指正!
欢迎小伙伴们的三连+关注!
往期系列:
【蓝桥杯简单篇】Python组刷题日寄Part01
【蓝桥杯简单篇】Python组刷题日寄Part02
【蓝桥杯简单篇】Python组刷题日寄Part03
简单篇04
题目:
时间限制:
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!=1∗2∗3∗4∗5=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))
题目:
时间限制:
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 4018224312→4∗1∗8∗2∗2∗4∗3∗1∗2→3072→3∗7∗2→42→4∗2→8
编写一个程序,输入一个正整数(该整数不会超过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)
题目:
时间限制:
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))))
题目:
时间限制:
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)
题目:
时间限制:
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 1→2→3→1 和 1 → 3 → 2 → 1 1\rightarrow 3\rightarrow 2\rightarrow 1 1→3→2→1,共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])
题目:
时间限制:
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)
题目:
时间限制:
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=2∗3∗3∗5.
输入描述:
无
输出描述:
无
样例输入:
66 66 66
样例输出:
66 = 2 ∗ 3 ∗ 11 66=2*3*11 66=2∗3∗11
答案:
分析:
方法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))
题目:
时间限制:
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))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
编程,输入一个10进制正整数,然后输出它所对应的八进制数。
输入描述:
一个10进制数
输出描述:
对应8进制数
样例输入:
10
样例输出:
12
答案:
分析:
format
格式化输出,b
o
d
x
分别表示二、八、十、十六进制
n = int(input())
print('{:o}'.format(n))
题目:
时间限制:
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)