蓝桥杯Python初级测试题之省赛题7
1. 寻找质数
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……
请你计算第 2019 个质数是多少?
解题思路:
(1) 设置一个自增1的正整数变量n
(2) 设置一个子函数判断是否为质数,如果不是1和自己,所有数都不能整除的为质数
(3) 对n进行判断,当找到2019个质数时,输出结果
# 定义变量n为自增自然数,n_zs为质数的序号
n=1
n_zs=0
# 判断输入的数字是不是质数,如果不是1和自己,所有数都不能整除
def is_zs(s):
for i in range(s):
if (i+1) !=1 and (i+1)!=s:
if s % (i+1)== 0:
return False
break
return True
# 判断自增的数字是否为质数,是则序号增加1直到2019
while True:
n+=1
if is_zs(n) == True:
n_zs+=1
if n_zs== 2019:
print(n)
break
2. 分数之和
题目描述
解题思路:
(1) 从0-19进行自增循环获取每一个分数,分数的分母就是2的i次方
(2) 为了获取全部分数和,需要2步求和进行累积,分析规律发现分子为上一个分子和*2+1,分母则为当前分母
(3)求出分数和以后,设置一个最大公约数函数,对分子分母求最大公约数
(4)将分数和的分子分母除以最大公约数,简化得到互质的分数和的分数
import math
# 设计一个子函数求最大公约数
def max_gys(a, b):
# 获取输入两个数中的最小值,如果最小值为1,则直接返回1
if a <= b:
min_n = a
else:
min_n = b
if min_n == 1:
return 1
# 从两个数中比较小的值开始-1循环,直到找到最大公约数,返回该值
for k in range(min_n, 1, -1):
# print(k)
if a % (k + 1) == 0 and b % (k + 1) == 0:
return k + 1
# 最终找不到还是返回1
return 1
# 从1到20开始循环
for i in range(20):
fz = 1
#分母为2的i次方
fm = int(math.pow(2, i))
# 每次两个相邻的分数之和都有规律,比如1/1+1/2之后的分母等于后一个分母,分子等于分子累加的和*2+1
if i == 0:
h_fz = 1
h_fm = 1
else:
h_fz = h_fz * 2 + 1
h_fm = fm
m_gys = max_gys(h_fz, h_fm)
# 如果有最大公约数,则分子分母同除以最大公约数,以满足互质条件
if m_gys != 1:
h_fz = int(h_fz / m_gys)
h_fm = int(h_fm / m_gys)
#输出分数
print("%d/%d" % (h_fz, h_fm))