python获取质数

质数概念

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

题目

统计所有小于非负整数 n 的质数。

代码

# -*- coding: utf-8 -*-
'''
质数概念:只能被1和自身整除的数字,叫做质数
'''
import math
import time


class Solution:
    ''' 暴力的方法,将其对每一个比其小的数进行取余运算
        如果任一余数为0。则一定不是质数,否则就是质数。(数字1除外)
    '''

    def getPrimes(self, n: int) -> list:
        Primes_list = []
        for i in range(2, n+1):
            sign = True
            for j in range(2, i):
                if i % j == 0:
                    sign = False
                    break
            if sign:
                Primes_list.append(i)
        return Primes_list

    '''
        优化暴力方法,我们可以发现,假如一个数为 9 ,那么其二分之一(4.5)后的数都可以不用进行计算,
        因为肯定是有余的 。事实上情况会比这更好一些:对正整数 n ,如果用 2 到 √n 之间(包含边界)的
        所有整数去除,均无法整除,则 n 为质数。
    '''

    def getPrimes2(self, n: int) -> list:
        Primes_list = []
        for i in range(2, n+1):
            sign = True
            for j in range(2, int(math.sqrt(i))+1):
                if i % j == 0:
                    sign = False
                    break
            if sign:
                Primes_list.append(i)
        return Primes_list
    '''
    如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,...一定不是质数。
    因此,可以进行将质数标记为1,非质数标记为0.
    '''
    def getPrimes3(self, n: int) -> list:
        isPrimes = n*[1]
        Primes_list = []
        for i in range(2, n+1):
            if isPrimes[i-1]:
                Primes_list.append(i)
                for j in range(i*i,n+1,i):
                    isPrimes[j-1]=0
        return Primes_list

if __name__ == "__main__":
    s = Solution()

    time1 = time.time()
    result = s.getPrimes(10000)
    print(len(result), time.time()-time1)

    time2 = time.time()
    result2 = s.getPrimes2(10000)
    print(len(result2), time.time()-time2)

    time3 = time.time()
    result3 = s.getPrimes3(10000)
    print(len(result3), time.time()-time3)

结果

1229 0.2709805965423584
1229 0.007999658584594727
1229 0.001996278762817383

 

posted @ 2020-12-03 11:27  不能说的秘密  阅读(1825)  评论(0编辑  收藏  举报