📜  [L,R]中N的所有值的计数,使得直到N的质数也为质数(1)

📅  最后修改于: 2023-12-03 14:38:56.736000             🧑  作者: Mango

主题介绍:计算在区间[L, R]中有多少个数字N满足直到N为质数时也是质数

问题描述

给定区间[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]中的每个数字进行判断,即可得到答案。