zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)
    2014年个人总结
    是去是留?这是个问题
    电信限制ip的解决方案
    机械学习
    mac-mysql
    如何使用代码生成工具
    如何使用自定义表单和自定义流程
    test
    编程小问题001
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/14247449.html
Copyright © 2011-2022 走看看