一、每日一题
蓝桥杯真题之互质数的个数
我的解法:
两个数互质,说明两个数的最大公约数是1,定义了一个函数判断两个数的最大公约数,再在循环中判断,并实现计数。可以实现运行,缺点是时间复杂度很高,运行时间慢。
a,b = map(int, input().split()) # 实现在一行中输入两个数据
s = a ** b
count = 0
def gcd(m, n): # 定义判断最大公约数的函数
while n != 0:
m, n = n, m % n
return m
for i in range(s+1): # 在循环中判断这两个数的最大公约数是否为1
if gcd(i, s) == 1:
count += 1
print(count) # 最后输出结果
二、堆排序的实现
向下调整的实现
有详细的注释,但是还是不好理解,确实是挺难挺复杂的,建议大家是去b站找视频仔细看看讲解并自己动手实践!!如果我有时间了话会再出详细的图解或者视频。
def sift(li, low, high):
"""
:param li: 用列表存放树结构
:param low: 堆的根节点位置
:param high: 堆的最后一个元素的位置
:return:
"""
i = low # i最开始指向根节点
j = 2 * i + 1 # j最开始指向左孩子
tmp = li[low] # 将栈顶保存起来
while j <= high: # 循环条件为只要j不越过列表的界
if j + 1 <= high and li[j] < li[j+1]: # 如果右孩子有,并且比左孩子大
j = j+1 # 那么把指针指向数字大的右孩子
if li[j] > tmp:
li[i] = li[j] # 将i位置赋值为较大的数
i = j # 并将i,j指针向下移动
j = 2 * i +1
else: # 如果tmp更大,将tmp放到i的位置上
li[i] = tmp # 把tmp放到某个子树的根节点上
break
else:
li[i] = tmp # 把tmp放到叶子节点上
堆排序函数
def heap_sort(li):
n = len(li)
for i in range((n-2)//2, -1, -1):
# i 表示建堆的时候调整的堆的下标
sift(li, i, i-1)
# 建堆完成了
for i in range(n-1, -1, -1):
# i指向当前堆的最后一个元素
li[0], li[i] = li[i], li[0]
sift(li, 0, i-1) # i-1是新的high
实现过程真的不好写,不好理解,多加练习!