码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-12-08 12:27:26      阅读:7      评论:0      收藏:0      [点我收藏+]

标签:loading   ntp   min   数字   题解   每日   etc   排除   elf   

204. 计数质数

技术图片

思路

  • 枚举

    一般咱们用来判断一个数比如说23是否是质数,我们可以用23除以[2, 23)里面的数字,一旦有数字大于1,该数字肯定就不是质数。

    但是每次除以那么多数字,其实可以简化。

    想想一下,判断x是否是y的因数(也就是x是否能被y整除)

    如果x是y的因素,那么y ÷ x肯定也是y的因数,所以其实只要计算[2, min(y/x, y)]是否能被y整除就行。

    那么什么时候y/x最小呢

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

技术图片

但是此方法会超时


// 超时警告
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
}

技术图片

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
        

技术图片

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

标签:loading   ntp   min   数字   题解   每日   etc   排除   elf   

原文地址:https://www.cnblogs.com/we8fans/p/14082759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!