📅  最后修改于: 2023-12-03 14:38:56.736000             🧑  作者: Mango
给定区间[L, R],计算在该区间内,有多少个数字N满足当把该数字的每个前缀都看作一个十进制数时(即十进制下的第一位及之后的所有数字),直到该前缀形成的数字是质数时,该数字仍然是质数。
例如,19是质数,它的每个前缀都是质数,所以19符合条件;而20不满足条件,因为它的第二个前缀(即2)不是质数。
请你完成一个函数,用来计算[L, R]中有多少个满足条件的数字N。其中,1<=L<=R<=10^12,最多只需要判断到10^5以内的质数。
这道题需要我们先对质数进行筛选,再来对[L,R]区间的每个数进行判断。首先,我们通过筛选法,将2至10^5之间的质数全部筛选出来。
对于[L,R]中的每个数字N,我们将其拆分为若干个前缀,计算每个前缀是否为质数。具体地,我们先将该数字拆分为若干个数字组成的数组,例如N=1234,我们可以把它拆分为{1,2,3,4}。接下来,我们从第一位开始,依次计算它的每个前缀是否为质数。
例如,计算前缀1是否为质数时,我们可以使用上面筛选出来的质数列表,逐个判断1、2、3、...、10^5中,哪些数字是质数。如果1是质数,则计算下一个前缀(即12)是否为质数。如果1不是质数,则停止计算,该数字N不符合条件。
def countPrime(L, R):
primes = set() # 存储2至10^5间的质数
not_primes = set() # 存储2至10^5间的合数
for i in range(2, 10**5+1):
if i not in not_primes:
primes.add(i)
not_primes.update(set(range(i*i, 10**5+1, i)))
count = 0
for i in range(L, R+1):
s = str(i)
valid = True
for j in range(len(s)):
if int(s[:j+1]) not in primes:
valid = False
break
if valid and i in primes:
count += 1
return count
以上就是对该题的介绍和解题思路,我们通过筛选出2至10^5间的质数,再对[L,R]中的每个数字进行判断,即可得到答案。