约数

试除法求 num 的约数

思路
约数肯定是成对出现的,所以只需要枚举到最小的那个约数字就好了。最小的约数最大为 , , 即
def get_divisors(num): res = [] # 遍历所有的 i i = 1 while i <= num // i: if num % i == 0: res.append(i) if i != num // i: res.append(num // i) i += 1 return res
时间复杂度

约数个数 约数之和

思路
将 num分解为 ,因式分解参考
质数 or 素数
那么约数个数为:
因为每个因子 都有 种选择,即
约数之和为:

最大公约数:辗转相除法 or 欧几里得算法

用来求解最大公约数。
思想
证明
方法:左边的任意一个公约数 一定也是右边的公约数,右边的也一定是左边的
假设d为左边的公约数,,即a / d , b/d 均为整数。那么d同时也是 右边(b, a%b)的公约数。
因为取模运算 a%b= a - cb, c =a // b。
def gcd(a, b): if b == 0: return a return gcd(b, a%b) def gcd(a, b): # 保证了 a > b if a < b: return gcd(b, a) while b > 0: temp = a % b a = b b = temp return a # 计算 一组数字的 最大公约数 def gcd_nums(nums): g = nums[0] for i in range(1, len(nums)): g = gcd(g, nums[i]) return g
时间复杂度
最小公倍数可以用两个数相乘除以最大公约数来计算

最小公倍数

最小公倍数:两个数的乘积除以最大公约数的值为最小公倍数,直接输出即可。
def gbs(a, b): return a * b // gcd(a, b) # 一组数字的 最小公倍数 def gbs(nums): a, b = nums[0], nums[1] g = a * b // gcd(a, b) for i in range(2, len(nums)): g = g * nums[i] // gcd(g, nums[i]) return g