133-204. 计数质数

统计所有小于非负整数 n 的质数的数量。 (前三个我写的[其实就以前看过]超时了,后面自己想吧)
class Solution(object):
    def countPrimes1(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 2:
            return 0

        primes_list = [2]
        # 根据一条定理,可以被指数整除的数一定不是指数,反推出如果不被被质数整除则是质数
        for i in range(3, n, 2):  # 这里从三开始,同时步长为2表示跳过偶数
            if i > 10 and (i % 4 != 3 and i % 4 != 1):
                continue

            flag = False
            for item in primes_list:
                if i % item == 0:
                    flag = True
                    break
                # 其中有一个规律,一个质数就可以找到整除他的数的范围是小于自己的开方范围数,超过这个数则表示没有
                if item + 1 > i ** 0.5:
                    break
            if not flag:
                primes_list.append(i)
        return len(primes_list)

    def countPrimes2(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 2:
            return 0

        primes_list = [2]
        # 根据一条定理,可以被指数整除的数一定不是指数,反推出如果不被被质数整除则是质数
        for i in range(3, n, 2):  # 这里从三开始,同时步长为2表示跳过偶数
            if i > 10 and (i % 4 != 3 and i % 4 != 1):
                continue

            flag = False
            for item in primes_list:
                if i % item == 0:
                    flag = True
                    break
                # 其中有一个规律,一个质数就可以找到整除他的数的范围是小于自己的开方范围数,超过这个数则表示没有
                if item + 1 > i ** 0.5:
                    break
            if not flag:
                primes_list.append(i)
        return len(primes_list)

    def countPrimes3(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 2:
            return 0

        count = 1
        for i in range(3, n, 2):

            if i > 10 and (i % 4 != 3 and i % 4 != 1):
                continue

            flag = False
            for j in range(3, int(i ** 0.5) + 1, 2):
                if i % j == 0:
                    flag = True
                    break
            if not flag:
                count += 1
        return count

    def countPrimes4(self, n):
        """
        埃氏筛: 请看力扣官网
        :type n: int
        :rtype: int
        """
        if n <= 2:
            return 0

        is_prime = [1] * n
        ans = 1
        for i in range(3, n, 2):
            if is_prime[i] == 1:
                ans += 1
                if i * i < n:
                    j = i * i
                    while j < n:
                        is_prime[j] = 0
                        j += i
        return ans

    def countPrimes(self, n):
        """
        线性筛: 请看力扣官网
        :type n: int
        :rtype: int
        """
        prime_list = [2]
        is_prime = [1] * n
        for i in range(3, n, 2):

            if is_prime[i] == 1:
                prime_list.append(i)

            for k in range(len(prime_list)):
                if i * prime_list[k] < n:
                    is_prime[i*prime_list[k]] = 0
                    if i % prime_list[k] == 0:
                        break
                else:
                    break
        return len(prime_list)


if __name__ == '__main__':
    s1 = Solution()
    start = time.time()
    print(s1.countPrimes(1500000))
    print(time.time() - start)
posted @ 2021-01-07 17:09  楠海  阅读(85)  评论(0编辑  收藏  举报