计算小于非负数n的素数数量。我创建了以下代码,但复杂性太高。如果有人能给我一个更好的解决方案,我真的很感激。
import math
class Solution(object):
def countPrimes(self, n):
PrimeCount=0
primelist=[]
for i in range(2,n):
if self.primeCheck1(i,primelist)==True:
primelist.append(i) #try2 with new logic
PrimeCount=PrimeCount+1
return PrimeCount
def primeCheck1(self,n,primelist):
flag=False
if n==2:
return True
elif n==3:
return True
sqroot=int(math.sqrt(n))
for j in range(0,sqroot):
if n%primelist[j]==0:
flag=True
break
if flag!=True:
return True
else:
return False
答案 0 :(得分:1)
我喜欢你构建素数列表的方式,并使用该列表来检测更大的质数。你的代码比它需要的更复杂,你是对的,特别是你不需要你的flag
变量。
你在primeCheck1()
方法中错过了一些技巧,可以加快速度。由于我的Python不存在,所以这是类似Python的伪代码。我假设你将能够转换它。
def primeCheck1(self, n, primelist):
# Handle even numbers.
if n % 2 == 0:
# The only even prime is 2.
return (n == 2)
# Handle multiples of 3.
if n % 3 == 0:
return (n == 3)
# Handle remaining numbers.
sqroot = int(math.sqrt(n))
for j in range(0, sqroot):
if n % primelist[j] == 0:
return False # Not a prime number.
# If we get this far then the number is prime.
return True
end primeCheck1
在一个小问题上,您习惯不要将代码分开:a==b
而不是a == b
。使用空格作为分隔符可以使代码更易于阅读。
答案 1 :(得分:1)
对代码进行返工,将其加速3倍,计算不到100万的素数:
class Solution(object):
def countPrimes(self, n):
primelist = []
for i in range(2, n):
if self.primeCheck(i, primelist):
primelist.append(i)
return len(primelist)
def primeCheck(self, n, primes):
if n < 2:
return False
if n % 2 == 0: # 2 is the only even prime
return n == 2
for prime in primes:
if prime * prime > n: # easier to square many than sqroot one
return True
if n % prime == 0: # divisible by a prime, not a prime
return False
return True
solution = Solution()
print(solution.countPrimes(1000000))
这包括@rossum向你指出的一些技巧。
然而,我们可以做得更好。这里使用@ClockSlave's prime sieve code重新实现,在计算不到一百万的素数时,比原来的快22倍:
class Solution(object):
def __init__(self):
self.sieve = None
def countPrimes(self, n):
self.sieve = [True] * n
if n > 0:
self.sieve[0] = False
if n > 1:
self.sieve[1] = False
def mark_sieve(prime):
for index in range(prime + prime, n, prime):
self.sieve[index] = False
for number in range(2, int(n ** 0.5) + 1):
if self.sieve[number]:
mark_sieve(number)
return sum(self.sieve)
solution = Solution()
print(solution.countPrimes(1000000))
这里的胜利正在消除所有那些昂贵的部门。
答案 2 :(得分:0)
首先使用pip install sympy
安装sympy包。然后试试这个:
import sympy
PrimeCount=0
n=int(input("Number?"))
for elem in range(n):
if sympy.isPrime(elem):
PrimeCount+=1
print(PrimeCount)
答案 3 :(得分:0)
您可以使用按位筛算法。
SIZE = 1000000
LIMIT=int(math.sqrt(SIZE)+1)
prime = []
def sieve():
for i in range(SIZE/32):
prime[i]=0xffff
prime[0]&=~(1<<(1%32))
for i in range(LIMIT+1):
if(prime[i/32]&(1<<(i%32))):
for j in range(2*i, SIZE, j=j+i):
prime[j/32]&=~(1<<(j%32))
def isPrime(n):
return prime[n/32]&(1<<(n%32))
答案 4 :(得分:0)
def count_primes(prime):
check=2
main_res=0
while check <= prime:
result=0
control=1
while control <= check:
if check%control==0:
result+=1
control+=1
else:
control+=1
if result==2:
main_res+=1
check+=1
return main_res
# Test for COUNT PRIME
#print(count_primes(100))