204计数质数

题目:统计所有小于非负整数 的质数的数量.

来源:https://leetcode-cn.com/problems/count-primes/

法一:自己的超时代码

思路:和官方的方法事实上一样,但是代码没有用标记0 1的方法,导致很费时.删除每个质数的倍数时,都需要判断是否存在,如果是用标记0 1的方法不会出现这种问题,要学会这个切片技巧.

import math
class Solution:
    def countPrimes(self, n: int) -> int:
        if n in [1,2]:
            return 0
        amount = [i+1 for i in range(1,n-1)]
        ans = 0
        # def judge(a):
        #     for j in range(2,int(math.sqrt(a))+1):
        #         # 如果为合数,返回False
        #         if (a % j) == 0:
        #             return False
        #     return True
        while amount:
            a = amount.pop(0)
            ans += 1
            k = a
            while k * a <= n:
                if k*a in amount:
                    amount.remove(k*a)
                k += 1
        return ans

法二:别人的代码

思路:从前往后遍历,如果一个数是质数k,则把它后面所有大于等于k倍的数都标记为合数.如果一个数的标记为1,则其一定是质数,因为如果其为合数,前面一定存在它的因子,会把它标记为0.

class Solution:
    def countPrimes(self, n: int) -> int:
        if n < 2: return 0
        # 用1作为标记
        isPrimes = [1] * n
        # 0和1不是质数,设置为0
        isPrimes[0] = isPrimes[1] = 0
        # 这是一个定理:在 2 到 根号n 的范围内,当一个数是质数,将它所有的比n小的倍数设置成0
        for i in range(2, int(n ** 0.5) + 1):
            if isPrimes[i] == 1:
                # 这里很重要,i-1 * i 已经被前面的i-1删除了
                # 注意左边的这个n可以任意大
                isPrimes[i * i: n: i] = [0] * len(isPrimes[i * i: n: i])
        #现在每个质数位的flag为1,其余的位数为0.由于我们不需要知道质数是什么只要总数,因此直接返回list里面所有1的和就行。
        return sum(isPrimes)
if __name__ == ‘__main__‘:
    duixiang = Solution()
    a = duixiang.countPrimes(50)
    print(a)
    k = [1,2,3,4,5,6,7,8,9]
    k[0:20:2] = [0] * 5
    print(k)

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12244891.html

时间: 2024-08-02 09:56:29

204计数质数的相关文章

204. 计数质数 | Count Primes

Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Output: 4 Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7. 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 .

[LeetCode] 204. 计数质数

题目链接:https://leetcode-cn.com/problems/count-primes/ 题目描述: 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 思路: 质数就是除了 1 和本身找不到其他能除尽的数,思路请看题目的提示! 思路一:暴力法(超时)(大家可以学习一下 for ... else 的用法, 一般配合 break 使用) class Solution: def cou

204.计数质数

感觉挺简单的 结果掉坑了 超时警告 class Solution { public int countPrimes(int n) { int temp = 0; for(int i = 0 ;i < n ;i++){ if(isPrimeNumber(i)){ temp++; } } return temp; } public boolean isPrimeNumber(int n) { if(n == 1||n == 0) return false; if(n==2||n==3) { retu

【leetcode 简单】 第五十八题 计数质数

统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . class Solution: def countPrimes(self, n): """ :type n: int :rtype: int """ isPrime = [1] * max(2, n) isPrime[0],isPrime[1]=False,False x = 2 while x

LeetCode. 计数质数

题目要求: 统计所有小于非负整数 n 的质数的数量. 示例i: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 代码: class Solution { public: int countPrimes(int n) { if (n <= 2) return 0; vector<bool> prime(n, true); for(int i = 2; i*i < n; i++) { if(prime[i]) { for(int

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

leetcode实战—素数(埃拉托色尼筛选法包括证明、哈希、RSA)

前言 素数这个概念人类已经研究了上千年,但是的具体的起源却不得而知.早在公元前300年,欧几里得就在他的著作元素中证明了有无穷多个素数,同时也证明了任何一个整数都能够被某一个素数整除.时至今日,素数在计算机科学这样一个和数学联系紧密的学科中也有这个广泛的应用,比如布隆过滤器.伪随机数.RSA加密算法等等,所以掌握素数的特性以及应用能够帮助我们解决不少实际问题. 简介 素数(又称质数)是一个只能被1和它自己整除的整数,换句话说他只有两个因数--1和它自己.比如3是一个素数,因为3只能被1和3整除,

LeetCode 204 Count Primes(质数计数)(*)

翻译 计算小于一个非负整数n的质数的个数. 原文 Count the number of prime numbers less than a non-negative number, n. 分析 这道题以前遇到过,当时是用的最笨的办法,现在也没什么好想法,又恰好题目有提示,我就点开了.题目的提示是一条一条给出来的,我也就逐个的全点开了,感觉好失败-- public int countPrimes(int n) { int count = 0; for (int i = 1; i < n; i++

LeetCode OJ:Count Primes(质数计数)

Count the number of prime numbers less than a non-negative number, n. 计算小于n的质数的个数,当然就要用到大名鼎鼎的筛法了,代码如下,写的有点乱不好意思. 1 class Solution { 2 public: 3 int countPrimes(int n) { 4 vector<int> vtor(n + 1, 0); 5 vector<int> ret; 6 for (int i = 0; i <=