给定一个数N,我们如何求最大P*Q
√N = 5.196
Candidate primes: 2,3,5 --> [{2,13.5},{3,9},{5,5.4}] ->[{2,13},{3,7},{5,5}]
Solution: Max([2*13, 3*7, 5*5]) = 2*13 = 26
因此,暴力解决方案起作用。
再进一步,我们看到Q_max<=n/2,如果我们确实同意P
=√n。
我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。
√N = 5.196
Candidate P: 2,3 --> [{2,13},{3,9}] -->[{2,13},{3,7}]
(we drop {5,5} since N\P < √N i.e. 5 < 5.196)
Solution set: max([2*13, 3*7]) = 2*13 = 26
这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。
我们是否可以添加其他聪明的程序来进一步减少设置?
这与@RalphmRickenback描述的类似,但具有更严格的复杂性界限。
他描述的素数查找算法是Erathostenes的筛子,需要空间O(n),但时间复杂度为O(n log log n),如果你想对此更加小心,你可能想看看维基百科上的讨论。
在找到一个小于n//2
的素数列表后,您可以通过将一个指针开始在开头,另一个指针结束来扫描它一次,即复杂度为O(n)。如果这两个素数的乘积大于你的值,减小高指针。如果乘积较小,则将其与存储的最大乘积进行比较,并增加低指针。
这里是Python的完整实现,而不是伪代码:
def prime_sieve(n):
sieve = [False, False] + [True] * (n - 1)
for num, is_prime in enumerate(sieve):
if num * num > n:
break
if not is_prime:
continue
for not_a_prime in range(num * num, n + 1, num):
sieve[not_a_prime] = False
return [num for num, is_prime in enumerate(sieve) if is_prime]
def max_prime_product(n):
primes = prime_sieve(n // 2)
lo, hi = 0, len(primes) - 1
max_prod = 0
max_pair = None
while lo <= hi:
prod = primes[lo] * primes[hi]
if prod <= n:
if prod > max_prod:
max_prod = prod
max_pair = (primes[lo], primes[hi])
lo += 1
else:
hi -= 1
return max_prod, max_pair
在您的示例中,这将产生:
>>> max_prime_product(27)
(26, (2, 13))
形成N的非素数对是2个不同的非素数,其中数的乘积是N。 1<=n<=10^6
本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1
我的问题很简单,但我不知道如何解决我想要的。我必须找到小于给定数字的最大数素数,如果不存在则打印消息。 代码是有效的,如果数字是10,它会打印7,但我想做2个新的修改,我找不到解决方案。例如,如果给定的数字是1,我的程序应该如何修改以打印消息?我试着写一个if-else,但是如果我用if修改了while,这将不会有帮助。第二件事,如果给定的数是素数,代码仍然会找到比给定数少的数。如果我给数字7,输
O(n^2)算法简单。有没有人对此有更好的算法?
我想找到一组素数的最小集合,它可以和一个给定的值,例如9=7+2(而不是3+3+3)。 我已经使用eratosthens筛生成了一个数组素数 我正在按降序遍历数组,以获得数组中小于或等于给定数的最大素数。如果数字是奇数,这很有效。但对于偶数(例如122=113+7+2,但122=109+13)则失败。