📅  最后修改于: 2023-12-03 15:37:15.898000             🧑  作者: Mango
题目描述:给定两个正整数l和r,找到lr之间的数字,其最大公约数(GCD)等于1
本问题需要实现一个函数,输入参数包括两个正整数l和r,输出参数为一个整数数组,数组中的元素是lr之间所有最大公约数为1的数字。
显然,如果两个数字a和b之间存在质数p,且p是a和b的公约数,则p的次数在a和b的因数中必定都出现了。因此,如果我们枚举l和r之间所有的质数,然后筛选出它们的倍数(在l和r之间),从而找到l和r之间所有具有该质数的因子的数字,然后从中筛选出最大公约数为1的数字即可。
def sieve_of_eratosthenes(n):
# 生成小于等于n的所有质数
primes = []
is_prime = [True] * (n + 1)
for p in range(2, n + 1):
if is_prime[p]:
primes.append(p)
for i in range(p * p, n + 1, p):
is_prime[i] = False
return primes
def gcd(a, b):
if a < b:
a, b = b, a
while b:
a, b = b, a % b
return a
def find_gcd1_numbers(l, r):
# 找到l和r之间所有最大公约数为1的数字
primes = sieve_of_eratosthenes(r)
res = []
for i in range(l, r + 1):
flag = True
for p in primes:
if p * p > i:
break
if i % p == 0:
if gcd(p, i // p) != 1:
flag = False
break
if flag:
res.append(i)
return res
生成小于等于n的质数需要O(nloglogn)的时间。因此,时间复杂度主要取决于枚举l和r之间的数字和质数。
因为问题的输入l和r是有限数,因此枚举l和r之间的数字的时间复杂度为O(r-l+1)。
对于质数,如果我们假设它们在l和r之间的出现次数均匀分布,则枚举质数需要的时间复杂度为O((r-l+1)log(log(r))), 其中,log(log(r))是由于质数密度的逐渐下降。
因此,算法的总时间复杂度为O((r-l+1)log(log(r))),空间复杂度则取决于生成的质数。