zoukankan      html  css  js  c++  java
  • 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

    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    HOWTO get multiple value from the same name checkbox elements or radiobution elements
    你家有几台电脑
    *qian翻
    nginx 域名绑定
    linode设置汇总
    how to relize 301 redirect on bottle
    Nginx禁止未在服务器绑定的域名访问
    linode设置汇总
    sogouq免费企邮
    linode设置汇总
  • 原文地址:https://www.cnblogs.com/yunhgu/p/14078592.html
Copyright © 2011-2022 走看看