如何解决找出附近没有质数的数
假设我有一个正整数 N。如果从 Nk 到 N+k 之间没有质数,则称为 孤独,其中 k 是一个小于 N 的正整数。
给定两个整数L和H,在这个范围内有多少Lonely整数[L,H](包括在内)。
我假设 k。 假设如果 L=3480 和 H=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 的差异来增加孤独数的数量。这消除了对第二部分代码的需要。
解决方法
您能否在 left
和 right
方法中简单地将 return 语句更改为此?
return max(ans,0)
这将产生:
print(prime_list[left(prime_list,num)])
# > 3491
print(prime_list[right(prime_list,num)])
# > 3499
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。