【问题标题】:Find numbers that have no primes in their vicinity查找附近没有素数的数字
【发布时间】:2021-08-23 08:38:40
【问题描述】:

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

给定两个整数LH,在这个范围[L,H]之间有多少个Lonely整数 em>(包括两者)。

我假设 k。 给定如果L=3480H=3750,则输出为2。(2个孤数分别为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 的差来增加孤独数的数量。这消除了对第二部分代码的需要。

【问题讨论】:

    标签: python python-3.x list primes sieve-of-eratosthenes


    【解决方案1】:

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

    return max(ans, 0)
    

    这将产生:

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

    【讨论】:

    • 我添加了一个编辑。我认为这将是一个更容易解决问题的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多