[Golang]力扣Leetcode—初级算法—数学—计数质数(厄拉多塞筛法)

默剧析取
• 阅读 759

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

链接力扣Leetcode—初级算法—数学—计数质数.

示例1

输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

示例2

输入:n = 0
输出:0

示例3

输入:n = 1
输出:0

标签:数组、数学、枚举、数论

思路:如果用暴力破解,那么毫无疑问会超时,我们可以用厄拉多塞筛法(Eratosthenes):即从2开始,2的倍数全部去掉;接下来3是质数,3的倍数全部去掉,如此下去,留下的都是质数。

  • 我们首先定义一个长度为n的bool数组,用来标识某个数是否是素数,如果不是素数就将数组中对应的位置置为true
  • 首先,0和1肯定不是质数,所以数组前两个元素的值置为true
  • 数组中初始化的时候每个元素对应的值都是false,从2开始,如果对应数组中的值还是false,那么说明了这个数一定是质数
  • 所以2是质数,那么将2翻倍的数一定不是质数,所以我们将2一直这样翻倍翻下去,直到某一个倍数超过n,那么数组中就没有对应的位置了,我们在这个过程中,将翻倍得到的数字在数组中对应的位置置为true
  • 然后遍历2的下一个数,首先看这个数在数组中对应位置的值是true还是false,如果是true说明了这个位置是由前面某个数翻倍得到的,说明他是合数,所以跳过,如果是false,说明了这个数不能由前面的数翻倍得到,那么他肯定是质数
  • 一直重复上述过程,直到这个2变成了最后的n

主要Go代码如下:

package main

import "fmt"

func countPrimes(n int) int {
    list := make([]bool, n)
    sum := 0

    for i := 2; i < n; i++ {
        if list[i] == false {
            sum++
        }
        for j := i + i; j < n; j += i {
            list[j] = true
        }
    }
    return sum
}

func main() {
    var n int
    fmt.Scanf("%d", &n)
    fmt.Println(countPrimes(n))
}

提交截图
[Golang]力扣Leetcode—初级算法—数学—计数质数(厄拉多塞筛法)

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
LeetCode 338. 比特位计数
原文链接: LeetCode338.比特位计数(https://my.oschina.net/ahaoboy/blog/3117631)https://leetcodecn.com/problems/countingbits/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
LeetCode初级算法(数组)解答
这里记录了LeetCode初级算法中数组的一些题目:加一本来想先转成整数,加1后再转回去;耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错。classSolution{public:vector<intplusOne(vector<int&digit
Wesley13 Wesley13
3年前
PHP算法之判断是否是质数
<h3质数的定义</h3<blockquote质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。</blockquote<h3实现思路</h3<p循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能够被整数,则肯定不是质数,相反,就是质数。</p<h3第一种算
贾蔷 贾蔷
3个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们
深度学习 深度学习
1个月前
NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解
一、题目解读问题(,)要求使用给定数量的火柴棒,构造形如ABC的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式数量。题目核心在于将数字拆解与火柴棒消耗建模为数学问题,寻找高效解法。二、解题思路采用火柴棒计数策略:1.关系
默剧析取
默剧析取
Lv1
如果未曾深入过对方的生活,就别妄想真的了解对方. 经典个性签名大全。
文章
5
粉丝
0
获赞
0