码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 恭喜你~遇到了最有趣的算法(三)数论篇


    哈喽~大家好呀,期末考试终于结束了,暑假准备去哪里玩呀?假期期间大家别忘了来充实自己,注意防疫安全。那么接下来我们的算法合集第三篇来了(题外话:最近肝的心疼~),今天我们来看看这篇最有趣的算法(三)数论篇吧。

     🥇个人主页:个人主页​​​​​             

    🥈 系列专栏:【算法】           

    🥉与这篇相关的文章:            

    恭喜你~遇到了最有趣的排序算法(一)恭喜你~遇到了最有趣的排序算法(一)_程序猿追的博客-CSDN博客
    恭喜你~遇到了最有趣的算法(二)恭喜你~遇到了最有趣的算法(二)_程序猿追的博客-CSDN博客
    操作系统中几种最最最常见的调度算法操作系统中几种最最最常见的调度算法(适用于软件设计师考试与期末考试复习)_程序猿追的博客-CSDN博客_操作系统先进先出算法例题

    目录

    一、 欧几里得算法

    二、扩展欧几里得算法

    三、求素数问题

    3.1 试除法

    3.2 朴素版的筛素数

    3.3 埃式筛法

    3.4 线性筛法

    3.5 比较快的判断素数的方法

    四、欧拉函数


    一、 欧几里得算法

    ✅欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。

    ✨作用:求两个正整数的最大公约数。

    🎀时间复杂度: O(logn)。

    1. int gcd(int a, int b)
    2. {
    3. return b ? gcd(b, a % b) : a;
    4. }

    我们这里求了最大公约数那么最小公倍数就不要落下了

    1. int lcm(int a, int b)
    2. {
    3. return a * b / gcd(a, b);
    4. }

    二、扩展欧几里得算法

    ✅这里我们有一个定理

    裴蜀定理:若 a, b是整数,且 (a, b) = d,那么对于任意的整数 x, y, ax + by 都一定是 d 的倍数,特别地,一定存在整数 x, y使 ax + by = d成立。

    ✨也就是说我们给出 a,b 来求出 x,y 的值。 

    🎀时间复杂度: O(logn)

    1. int exgcd(int a, int b, int &x, int &y)
    2. {
    3. if (!b)
    4. {
    5. x = 1; y = 0;
    6. return a;
    7. }
    8. int d = exgcd(b, a % b, y, x);
    9. y -= (a/b) * x;
    10. return d;
    11. }

     我们直接上题目

     

     三、求素数问题

    ✅素数问题是我们经典的题,什么是素数?

    素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数

    ✨说明:以下 primes[N],cnt是属于 int 数组,st[N] 是属于 bool 数组,而 N 是 const 定义的大小。

    🎀primes 就是用来装素数的,cnt 用来计数的,st 用来记录是否是素数的。

    3.1 试除法

    1. bool sushu(int n)
    2. {
    3. if(n == 1) return false;
    4. for(int i = 2; i <= n / i; i ++)
    5. if(n % i == 0)
    6. return false;
    7. return true;
    8. }

     

    这是我们通常的做法,也是最容易理解的做法。 

    3.2 朴素版的筛素数

    1. void get_primes1(int n)
    2. {
    3. for(int i = 2; i <= n; i++)
    4. {
    5. if(!st[i]) prime[cnt ++] = i;
    6. for(int j = i + i; j <= n; j += i)
    7. st[j] = true;
    8. }
    9. }

    通过 st 数组的 true 与 false 来区分是否是素数。 

    3.3 埃式筛法

    ✅以上我们知道了如何判断素数,但在一区间里面例如 2 ~ 10 里面有多少个素数呢?那么接下来我们来看看。

    1. void get_primes2(int n)
    2. {
    3. for(int i = 2; i <= n; i++)
    4. {
    5. if(!st[i])
    6. {
    7. prime[cnt ++] = i;
    8. for(int j = i; j <= n; j += i)
    9. st[j] = true;
    10. }
    11. }
    12. }

    🎀但我们明显发现时间复杂度为O(nlogn),太~高了,很容易 TLE,那么如何提速呢?看看下面的线性筛法吧。

    3.4 线性筛法

    ✅在 O(n) 的时间复杂度内求出 1∼n 之间的所有质数。

    1. void get_prime(int n)
    2. {
    3. for(int i = 2; i <= n; i++)
    4. {
    5. if(!st[i]) prime[cnt++] = i;
    6. for(int j = 0; prime[j] <= n / i; j++)
    7. {
    8. st[prime[j] * i] = true;
    9. if(i % prime[j] == 0) break;
    10. }
    11. }
    12. }

    ✨这里的用法就和上面的一模一样了,我就不展示了。 

    3.5 比较快的判断素数的方法

    1. bool ispri(int k)
    2. {
    3. if(k <= 1) return false;
    4. if(k <= 3) return true;
    5. if(k % 6 != 1 && k % 6 != 5) return false;
    6. for(int i = 5;i < k / i;i += 6) {
    7. if(k % i == 0 || k % (i + 2) == 0) return false;
    8. }
    9. return true;
    10. }

    四、欧拉函数

    ✅欧拉函数,一般记为 ϕ(n),表示小于等于 n 的数中与 n 互质的数的个数。

    1. void get_eulers(int n)
    2. {
    3. euler[1] = 1;
    4. for (int i = 2; i <= n; i ++ )
    5. {
    6. if (!st[i])
    7. {
    8. primes[cnt ++ ] = i;
    9. euler[i] = i - 1;
    10. }
    11. for (int j = 0; primes[j] <= n / i; j ++ )
    12. {
    13. st[primes[j] * i] = true;
    14. if (i % primes[j] == 0)
    15. {
    16. euler[i * primes[j]] = euler[i] * primes[j];
    17. break;
    18. }
    19. euler[i * primes[j]] = euler[i] * (primes[j] - 1);
    20. }
    21. }
    22. }

    看到这里,首先在这里感谢大家,谢谢大家对我的支持,我创建了一套专栏——Java学习之路(零基础到就业实战),感兴趣的可以去看看,接下来暑假的时间,我会把这套专栏认真学好写好,我们一起努力向着更好的自己前进,冲冲冲!

     (求关注)持续更新中……

  • 相关阅读:
    虹科HiveMQ MQTT Broker如何支持平板电脑实现高效远程管理?
    .Net 中间件 - 新开源代码生成器 -ReZero
    【深度学习】求解偏导数
    Autowired注入的变量都是单例吗?
    地铁车辆基础制动装置设计
    centernet的数据增强操作--仿射变换
    模糊测试面面观 | 车载以太网协议DOIP模糊测试实践案例分享
    2. IMU原理及姿态融合算法详解
    [Android]Mac电脑Android Studio使用真机调试运行
    Win11运行虚拟机死机了?Win11运行VMware虚拟机崩溃的解决方法
  • 原文地址:https://blog.csdn.net/aasd23/article/details/125355816
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号