蓝桥杯真题之互质数的个数
我的解法:
两个数互质,说明两个数的最大公约数是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
实现过程真的不好写,不好理解,多加练习!