微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找出附近没有质数的数

如何解决找出附近没有质数的数

假设我有一个正整数 N。如果从 NkN+k 之间没有质数,则称为 孤独,其中 k一个小于 N 的正整数。

给定两个整数LH在这个范围内有多少Lonely整数[L,H]包括在内)。

我假设 k。 假设如果 L=3480H=3750,则输出为 2。(2 个 Lonely 数分别为 3480 和 3750)

到目前为止我所做的首先是使用以下代码实现了一个分段筛:

import math

def fillPrimes(chprime,high):
  ck = [True]*(high+1)
  l = int(math.sqrt(high))
  for i in range(2,l+1):
    if ck[i]:
      for j in range(i*i,l+1,i):
        ck[j] = False
        
  for k in range(2,l+1):
    if ck[k]:
      chprime.append(k)

def segmentedSieve(low,high):
  chprime = list()
  fillPrimes(chprime,high)
  prime = [True] * (high-low + 1)
  for i in chprime:
    lower = (low//i)
    if lower <= 1:
      lower = i+i
    elif (low % i) != 0:
      lower = (lower * i) + i
    else:
      lower = lower*i
    for j in range(lower,high+1,i):
      prime[j-low] = False
  
  for k in range(low,high + 1):
    if prime[k-low] and k>1:
      prime_list.append(k)

low = 3480
high = 3750
k = 10
prime_list = []
print("\nPrimes in Range %d to %d are"%(low,high))
segmentedSieve(low-k,high+k)
print(prime_list)

然后尝试对该列表进行二分查找,以查找 N-k 和 N+k 之间是否存在任何质数。

def left(prime_list,num): 
    start = 0; 
    end = len(prime_list)-1; 
    ans = -1; 
    while (start <= end): 
        mid = (start + end) // 2; 
        if (prime_list[mid] >= (num-k)): 
            end = mid - 1; 
        else: 
            ans = mid; 
            start = mid + 1; 
    print(ans)
    return ans;

def right(prime_list,num):
    start = 0;
    end = len(prime_list)-1;
    ans = -1;
    while (start <= end):
        mid = (start + end) // 2;
        if (prime_list[mid] <= (num+k)):
            start = mid + 1;
        else:
            ans = mid;
            end = mid - 1;
    print(ans)
    return ans;

num = 3481
k = 10
##if left(prime_list,num) != -1:
print(prime_list[left(prime_list,num)])
##if right(prime_list,num) != -1:
print(prime_list[right(prime_list,num)])

这就是我遇到心理障碍的地方。

我的错误包括我返回的素数在数组中移动了一个位置,这没什么大不了的,但是当我开始达到 H 时,我遇到了无法解决错误。 (当我在 ans 中收到负数时,它开始从末尾读取数组,就像 python 喜欢做的那样。)

任何帮助/想法?

编辑: 如果我们计算两个连续质数之间的差异并且它们相差超过 2k+1,我们将通过质数差距和 2k+1 的差异来增加孤独数的数量。这消除了对第二部分代码的需要。

解决方法

您能否在 leftright 方法中简单地将 return 语句更改为此?

return max(ans,0)

这将产生:

print(prime_list[left(prime_list,num)])
# > 3491
print(prime_list[right(prime_list,num)])
# > 3499

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。