每日一题20201203(204. 计数质数)

简介: 计数质数解法

204. 计数质数

16.jpg

image-20201203195128240

思路


  • 枚举
    一般咱们用来判断一个数比如说23是否是质数,我们可以用23除以[2, 23)里面的数字,一旦有数字大于1,该数字肯定就不是质数。
    但是每次除以那么多数字,其实可以简化。
    想想一下,判断x是否是y的因数(也就是x是否能被y整除)
    如果x是y的因素,那么y ÷ x肯定也是y的因数,所以其实只要计算[2, min(y/x, y)]是否能被y整除就行。
    那么什么时候y/x最小呢


引用一下题解,感觉比我解释的好:

17.jpg

image-20201203201748756

但是此方法会超时



// 超时警告
func isPrime(x int) bool {
    for i := 2; i*i <= x; i++ {
        if x%i == 0 {
            return false
        }
    }
    return true
}
func countPrimes(n int) (cnt int) {
    for i := 2; i < n; i++ {
        if isPrime(i) {
            cnt++
        }
    }
    return
}
  • 埃氏筛
    简单的说就是,如果x是质数,那么2x 3x 4x....这些一定不是质数
    那么从2开始我们就可以找出2的2倍,3倍,排除这些非质数,一直遍历,看数组里还有哪些质数,数量+1,返回总数即可
    所以可以写出如下代码:


func countPrimes(n int) (cnt int) {
    // 创建一个bool数组,里面存放第N个数是否是质数
    // 初始化,使得每个数都是质数
    isPrime := make([]bool, n)
    for i := range isPrime {
        isPrime[i] = true
    }
    // 从2开始 2是质数,把数组里2的倍数都刷为素数
    for i := 2; i < n; i++ {
        if isPrime[i] {
            cnt++
            for j := 2 * i; j < n; j += i {
                isPrime[j] = false
            }
        }
    }
    return
}

18.jpg

image-20201203204422642


class Solution:
    def countPrimes(self, n: int) -> int:
        ans = 0
        result = [True for i in range(n)]
        for i in range(2, n):
            if result[i]:
                ans += 1
            j = 2 * i
            while j < n:
                result[j] = False
                j += i
        return ans

19.jpg

image-20201203204605411



相关文章
|
5天前
【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解
【刷题日志】深度理解除(/)与取模(%)附水仙花数以及变种水仙花数题解
|
5天前
|
JavaScript
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
【leetcode】204. 计数质数 暴力 & 埃拉托斯特尼法
13 0
|
5天前
|
JavaScript
【leetcode】204--计数质数-暴力-&-埃拉托斯特尼法
【leetcode】204--计数质数-暴力-&-埃拉托斯特尼法
12 0
|
5天前
春节每日一题~(自除数,除自身以外的数的乘积)
春节每日一题~(自除数,除自身以外的数的乘积)
13 1
|
5天前
|
算法
算法题解-计数质数
算法题解-计数质数
|
5天前
【每日一题Day198】LC1419数青蛙 | 计数
【每日一题Day198】LC1419数青蛙 | 计数
24 0
|
10月前
LeetCode-计数质数
LeetCode-计数质数
|
9月前
|
算法 C语言 C++
【数论】试除法判断质数,分解质因数,筛质数
将定义进行模拟,若整除了除1与其自身的另外的数,则为质数
76 0
|
10月前
|
Python
【每周一坑】​正整数分解质因数 +【解答】计算100以内质数之和
关于分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。分解质因数只针对合数。
|
11月前
【leetcode】204. 计数质数
【leetcode】204. 计数质数