Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang 刷leetcode 数学基础(1)素(质)数

golang 刷leetcode 数学基础(1)素(质)数

作者头像
golangLeetcode
发布于 2022-08-02 08:47:56
发布于 2022-08-02 08:47:56
28900
代码可运行
举报
运行总次数:0
代码可运行

求1——n的素数的个数,有以下三种方法:

1,遍历法:

对于k(1<k<=n);判断k 是否可以被 2到sqrt(k)的整数整除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func isprime(x int) bool{
    if x<=1{
        return false
        }
    for(i:=2;i<=sqrt(x+0.5);i++){//+0.5是为了防止精度误差
        if x%i==0{   
        return false
        }
     }
    return true
 }

此方法的问题在于许多不必要的计算,因此可以想到用空间换时间:筛选出来的素数的倍数都可以标记为合数

2,埃氏筛法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func init(){
prime:=make(map[int]bool) //prime[i]为flase表示i为质数
//初始化,默认都是
for(i:=2;i<maxn;i++){
        if !prime[i]{
            for j:=2*i;j<maxn;j+=i){//把所有i的倍数都进行标记
                        prime[j]=true;
            }
    }
  }
}

欧拉筛法优化的一点就是改进了埃氏筛法的一点冗余:可以发现,在埃氏筛法中,我们对每一个n都标记了不止一次。比如10,当i=2时,10作为2的倍数被标记一次,当i=5时,10依然是5的倍数,又被多余的标记一次。

3,欧拉筛选法

欧拉筛法思想:

其基础是 “任何一个合数都可以由两个质数相乘得到” 。那么对于每一个n我们都可以用比它小的某一个质数来标记。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func prime(n int)int{
    m:=make([]int,n)
    p:=make([]int,n)
    count:=0
    for i:=2;i<=n;i++{
        if m[i-1]==0{  // 如果未被筛过,则为素数
            p[count]=i
            count++
        }
        for j:=0;j<count;j++{
            if i*p[j]>n{
                break
            }
            m[i * p[j]-1] = 1;     // 将已经记录的素数的倍数进行标记
            if i % p[j] == 0{     //关键步骤
        break
            }
        }
    }
    fmt.Println(count)
    return count
}

欧拉筛的难点就在于对if (i % prime[j] == 0)这步的理解,当i是prime[j]的整数倍时,记 m = i / prime[j],那么 i * prime[j+1] 就可以变为 (m * prime[j+1]) * prime[j],这说明 i * prime[j+1] 是 prime[j] 的整数倍,不需要再进行标记(在之后会被 prime[j] * 某个数 标记),对于 prime[j+2] 及之后的素数同理,直接跳出循环,这样就保证了每个合数都是被它的最小因子筛去的,避免了重复标记。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
欧拉筛法(线性筛)的学习理解
在刚接触编程语言时,对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n^2),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期。在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛法,也即 O(n)的线性筛法。
全栈程序员站长
2022/07/22
1.8K0
欧拉筛法(线性筛)的学习理解
面试官本想拿一道求素数搞我,但被我优雅的"回击"了
现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几下子。但在面试中,我们这些小生存者不能全盘否定只能单点突破—从某个问题上让面试官眼前一亮。这不,今天就来分享来了。
bigsai
2020/12/17
4100
面试官本想拿一道求素数搞我,但被我优雅的"回击"了
线性筛素数(探索中的不断优化)
工欲善其事必先利其器 首先素数是什么? 素数就是一个数除了1和他本身没有其他因数的数叫做质数。 合数即为对立概念 当然,1既不是素数也不是合数 素因子是什么? 由欧拉函数得到结论: 每一个合数都可以写成几个素数相乘的形式, 这些素数即为该合数的质因子
glm233
2020/09/28
6040
Java实现质数筛的三种方法
今天在做一个算法题的时候遇到一个需要求质数的情况,但是本人比较菜只会暴力做法,所以在此记录学习一下质数筛选除了暴力以外的其它做法!
才疏学浅的木子
2023/10/17
3750
Java实现质数筛的三种方法
质数筛与欧拉函数
我们提前设置一个标记数组prime[N] ,提前标记好数字的质数状态,这样就能减少重复判断。
fishhh
2022/08/30
6610
质数筛与欧拉函数
基础数论总结
从右往左。可以一直递推,然后到最后一项,然后快速幂求矩阵,矩阵最终的结果就是所求结果。更新:java的矩阵通用乘法可以表示为,可以将下列代码替换道ac代码中:
bigsai
2019/09/24
7510
基础数论总结
204. 计数质数
解1:小学数学没有学好,先来一下质数定义。质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。暴力拆解,时间复杂度达不到,数很大时,耗时长。看解2。
张伦聪zhangluncong
2022/10/26
6230
C/C++中的素数判定
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:C/C++中的素数判定 更多内容请见👇 C/C++中的基础数据类型 C与C++的最常用输入输出方式对比 C语言竟支持这些操作:C语言神奇程序分享 ---- 本文目录 1.什么是素数 2.素数的两种判断方法 2.1 暴力法 2.1.1 从 2 到 √n 2.1.2 6n-1与6n+1 2.2 筛法 2.2.1 埃
小嗷犬
2022/11/15
8440
C/C++中的素数判定
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
简介:数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
GeekLiHua
2025/01/21
870
【狂热算法篇】解锁筛法密码:埃氏筛与线性筛(欧拉筛)的深度剖析
这里有点草率,但是还是可以看懂的,每次以遍历选中的倍数去标记成合数也就是1,每次遍历的都是素数,也就是为0,放入primer数组,直到达到我们设定的顶值n;后面会依次对下面的两种筛法做靠近调整(基于两个for嵌套方式不同以及优化的不同)。
羑悻的小杀马特.
2025/01/23
1390
【狂热算法篇】解锁筛法密码:埃氏筛与线性筛(欧拉筛)的深度剖析
【欧拉计划第 10 题】 质数之和 Summation of primes
首先单看题目知识点,涉及到素数(质数),和第七题 10001st prime一定会有类似之处
攻城狮杰森
2022/06/03
6670
素数的筛法
素数的筛法有很多种 在此给出常见的三种方法 以下给出的所有代码均已通过这里的测试 埃拉托斯特尼筛法 名字好长 :joy:  不过代码很短 思路非常简单,对于每一个素数,枚举它的倍数,它的倍数一定不是素数 这样一定可以保证每个素数都会被筛出来 还有,我们第一层循环枚举到 就好,因为如果当前枚举的数大于n,那么它能筛出来的数一定在之前就被枚举过 比如说: 不难发现我们从20枚举所筛去的数一定被5筛过 1 #include<cstdio> 2 #include<cmath> 3 using na
attack
2018/04/11
1.3K0
素数的筛法
三种素数筛的比较
在自然数集中,质数的数量不多而且分布比较稀疏,对于一个整数N,不超过N的质数大概有N/lnN个,即每lnN个数中可能会有一个质数。
ACM算法日常
2018/12/13
1.4K0
素数筛选算法
最近学习了一种筛素数的方法,能够以时间复杂度O(n),即线性时间完成。一开始不能理解其中的一句话,搜索了很久,大部分结果都是一群人在网上卖萌。好好思索了一番,按照自己的思路终于理解了。本文的内容绝不卖萌,但也难称严谨,仅以备忘,欢迎斧正。
我是东东东
2018/08/01
1.1K0
欧拉函数求法
φ(x)=x*(p1-1)/p1*(p2-1)/p2*(p3-1)/p3…*(pn-1)/pn 其中p1,p2,p3…是x的质因数;
全栈程序员站长
2022/09/23
3790
客户端基本不用的算法系列:素数筛法
今天的内容实用而且简单!素数问题是从来都是数学家热衷探索的领域,也是程序设计竞赛和 LC 中,解决数论相关问题的基础,下面本文介绍如何更科学地筛素数和一些相关的小知识。
用户2932962
2019/12/22
1.7K0
leetcode每日一题:204. 计数质数
https://leetcode-cn.com/problems/count-primes/
用户3578099
2020/12/14
4400
浅谈欧拉函数[通俗易懂]
欧拉函数听起来很高大上,但其实非常简单,也是NOIP里的一个基础知识,希望大家看完我的博客能有所理解。 数论是数学的一个分支,它只讨论正整数的性质,所以以下都是针对正整数进行研究的。
全栈程序员站长
2022/09/23
1.3K0
数论及数论四大定理
数论是纯粹数学的分支之一,主要研究整数的性质。整数可以是方程式的解(丢番图方程)。有些解析函数(像黎曼ζ函数)中包括了一些整数、质数的性质,透过这些函数也可以了解一些数论的问题。透过数论也可以建立实数和有理数之间的关系,并且用有理数来逼近实数(丢番图逼近)。 按研究方法来看,数论大致可分为初等数论和高等数论。初等数论是用初等方法研究的数论,它的研究方法本质上说,就是利用整数环的整除性质,主要包括整除理论、同余理论、连分数理论。高等数论则包括了更为深刻的数学研究工具。它大致包括代数数论、解析数论、计算数论等等。
Coggle数据科学
2019/09/12
3.1K0
数论及数论四大定理
欧拉函数
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn) 其中 p1, p2……pn 为 x 的所有质因数,x 是不为 0 的整数 φ(1)=1(唯一和 1 互质的数就是 1 本身)【注意:每种质因数只一个。比如 12=223】
Cell
2022/02/25
4710
欧拉函数
相关推荐
欧拉筛法(线性筛)的学习理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验