iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >怎么求素数
  • 852
分享到

怎么求素数

2024-04-02 19:04:59 852人浏览 泡泡鱼
摘要

这篇文章主要讲解了“怎么求素数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么求素数”吧!前言现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,

这篇文章主要讲解了“怎么求素数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么求素数”吧!

前言

现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几下子。但在面试中,我们这些小生存者不能全盘否定只能单点突破—从某个问题上让面试官眼前一亮。这不,今天就来分享来了。

这年头,算法岗内卷不说,开发岗也有点内卷,对开发者要求越来越高了,而面试官也是处心积虑的 "刁难"  面试者,凡是都喜欢由浅入深,凡是都喜欢问个:你知道为什么?你知道原理吗?之类。并且,以前只是大厂面试官喜欢问算法,大厂员工底子好,很多甚至有ACM经验或者系统刷题经验,这很容易理解,但现在一些小公司面试官也是张口闭口  xx算法、xx数据结构你说说看,这不,真的被问到了。

求一个质数

在这么一次的过程,面试官问我算法题我不吃惊,我实现早把十大排序原理、复杂度分析、代码手写实现出来了,也把链表、树的各种操作温习的滚瓜烂熟,不过突然就是很诧异的面试官来了一道求素数问题,我把场景还原一下:

面试官:你知道怎么求素数吗?

我:求素数?

面试官:是的,就是求素数。

我:这很简单啊,判断一个数为素数,那么肯定就没有两个数(除了自身和1)相乘等于它,只需要枚举看看有没有能够被它整除的数就可以了,如果有那么就不是素数,如果没有,那么就是素数。

面试官露出一种失望的表情,说我说的对,但没答到点子上,让我具体说一下。

下面开始开始我的表演:

首先,最笨的方法,判断n是否为素数,就是枚举[2,n-1]之间有没有直接能够被n整除的,如果有,那么返回false这个就不是素数,否则就是素数,代码如下:

boolean isprime(int value){   for(int i=2;i<value;i++)   {        if(value%i==0)        {return false;}   }     return true; }

这种判断一个素数的时间复杂度为O(n).

但是其实这种太浪费时间了,完全没必要这样,可以优化一下  。如果一个数不是质数,那么必定是两个数的乘积,而这两个数通常一个大一个小,并且小的小于等于根号n,大的大于等于根号n,我们只需要枚举小的可能范围,看看是否能够被整除,就可以判断这个数是否为素数啦。例如100=2*50=4*25=5*20=10*10  只需要找2&mdash;10这个区间即可。右侧的一定有个对应的不需要管它。

boolean isprime(int value) {   for(int i=2;i*i<value+1;i++)     {        if(value%i==0)        {return false;}     }     return true; }

这里之所以要小于value+1,就是要包含根号的情况,例如  3*3=9.要包含3.这种时间复杂度求单个数是O(logn)。面试官我给你画张图让你看看其中区别:

怎么求素数

2

说到这里面试官露出欣慰的笑容。

面试官:不错不错,基本点掌握了

我:老哥,其实求素数精髓不在这,这个太低效在很多时候,比如求小于n的所有素数,你看看怎么搞?

面试官:用个数组用第二种方法求nlogn还行啊。

求多个素数

求多个素数的时候(小于n的素数),上面的方法就很繁琐了,因为有大量重复计算,因为 计算某个数的倍数  是否为素数的时候出现大量的重复计算,如果这个数比较大那么对空间浪费比较多。

这样,素数筛的概念就被发明和使用。筛的原理是从前往后进行一种递推、过滤排序以来统计素数。

埃拉托斯特尼(Eratosthenes)筛法

我们看一个数如果不是为素数,那么这个数没有数的乘积能为它,那么这样我们可以根据这个思想进行操作啊:

直接从前往后枚举,这个数位置没被标记的肯定就是素数,如果这个数是素数那么将这个数的倍数标记一下(下次遍历到就不需要在计算)。如果不是素数那么就进行下一步。这样数值越大后面计算次数越少,在进行具体操作时候可借助数组进行判断。所以埃氏筛的核心思想就是将素数的倍数确定为合数。

假设刚开始全是素数,2为素数,那么2的倍数均不是素数;然后遍历到3,3的倍数标记一下;下个是5(因为4已经被标记过);一直到n-1为止。具体流程可以看图:

怎么求素数

具体代码为:

boolean isprime[]; long prime[]; void getprime() {         prime=new long[100001];//记录第几个prime       int index=0;//标记prime当前下标         isprime=new boolean [1000001];//判断是否被标记过         for(int i=2;i<1000001;i++)         {             if(!isprime[i])             {                 prime[index++]=i;             }             for(int j=i+i;j<1000000;j=j+i)//他的所有倍数都over             {                 isprime[j]=true;                                 }         } }

这种筛的算法复杂度为O(nloglogn);别小瞧多的这个logn,数据量大一个log可能少不少个0,那时间也是十倍百倍甚至更多的差距。

欧拉筛

面试官已经开始点头赞同了,哦哦的叫了起来,可其实还没完。还有个线性筛&mdash;欧拉筛。观察上述的埃氏筛,有很多重复的计算,尤其是前面的素数,比如2和3的最小公倍数为6,每3次2的计算就也会遇到是3的倍数,而欧拉筛在埃氏筛的基础上改进,有效的避免了这个重复计算。

具体是何种思路呢?就是埃氏筛是遇到一个质数将它的倍数计算到底,而欧拉筛则是只用它乘以已知晓的素数的乘积进行标记,如果素数能够被整除那就停止往后标记。

在实现上同样也是用两个数组,一个存储真实有效的素数,一个用来作为标记使用。

  • 在遍历到一个数的时候,如果这个数没被标记,那么这个数存在素数的数组中,对应下标加1.

  • 不管这个数是不是素数,遍历已知素数将它和该素数的乘积值标记,如果这个素数能够被当前值i整除,那么停止操作进行下一轮。

具体实现的代码为:

boolean isprime[]; int prime[]; void getprimeoula()// 欧拉筛 {         prime = new int[100001];// 记录第几个prime         int index = 0;         isprime = new boolean[1000001];         for (int i = 2; i < 1000001; i++) {             if (!isprime[i]) {                 prime[index++] = i;             }             for (int j = 0; j < index && i * prime[j] <= 100000; j++){//已知素数范围内枚举                 isprime[i * prime[j]] = true;// 标记乘积                 if (i % prime[j] == 0)                     break;             }         } }

你可能会问为啥if (i % prime[j] == 0)就要break。

如果i%prime[j]==0,那么就说明i=prime[j]*k. k为一个整数。

那么如果进行下一轮的话

i*prime[j+1]=(prime[j]*k)*prime[j+1]=prime[j]*(k*prime[j+1])  当i=k*prime[j+1]两个位置就产生冲突重复计算啦,所以一旦遇到能够被整除的就停止。

怎么求素数

image-20201208121324157

你可以看到这个过程,6只标记12而不标记18,18被9*2标记。详细理解还需要多看看代码想想。过程图就不画啦!欧拉的思路就是离我较近的我给它标记。欧拉筛的时间复杂度为O(n),因为每个数只标记一次。

感谢各位的阅读,以上就是“怎么求素数”的内容了,经过本文的学习后,相信大家对怎么求素数这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么求素数

本文链接: https://www.lsjlt.com/news/84228.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么求素数
    这篇文章主要讲解了“怎么求素数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么求素数”吧!前言现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,...
    99+
    2022-10-19
  • python求素数代码怎么写
    以下是一个用python编写的求素数的代码:```pythondef is_prime(n):if n ...
    99+
    2023-08-25
    python
  • c语言怎么求素数的个数
    以下是求解素数个数的C语言代码:```c#include #include int isPrime(int num) {if (nu...
    99+
    2023-08-08
    c语言
  • java怎么求数组元素的和
    要计算数组元素的和,可以使用一个循环来遍历数组,并将每个元素相加。以下是一个示例代码:javapublic class Main {...
    99+
    2023-10-20
    java
  • java怎么求数组元素之和
    要求数组元素的和,可以使用循环遍历数组,将每个元素累加起来。具体实现如下: public class ArraySum { ...
    99+
    2023-10-27
    java
  • python怎么求整数n以内的素数
    可以使用以下方法来求整数n以内的素数:1. 创建一个空的列表`primes`来存储素数。2. 创建一个长度为n+1的布尔类型列表`i...
    99+
    2023-08-23
    python
  • C++怎么用埃式筛法求解素数
    本篇内容介绍了“C++怎么用埃式筛法求解素数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!埃式筛法首先要了解什么式埃式筛法之前,需要知道一个...
    99+
    2023-07-04
  • 使用java怎么对数组元素求和
    使用java怎么对数组元素求和?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面...
    99+
    2023-06-14
  • python numpy.power()数组元素怎么求n次方
    本篇内容介绍了“python numpy.power()数组元素怎么求n次方”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!如下所示:nump...
    99+
    2023-06-14
  • c语言怎么求100以内的素数
    求100以内的素数可以使用以下的C语言代码:```c#include int isPrime(int n) {if (n ...
    99+
    2023-08-08
    c语言
  • javascript如何求素数
    这篇文章主要讲解了“javascript如何求素数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript如何求素数”吧! ...
    99+
    2022-10-19
  • c语言怎么求一个区间中素数个数
    要求一个区间中素数的个数,可以使用以下的方法:1. 编写一个函数`isPrime()`来判断一个数是否为素数。该函数接受一个参数n,...
    99+
    2023-10-12
    c语言
  • php怎么求二维数组有多少个元素
    在php中,可以利用count()或sizeof()函数来求二维数组有多少个元素;这两个函数都能统计二维数组中的元素数目,语法“count($arr,$m)”或“sizeof($arr,$m)”,只需要将参数“$m”的值设置为“1”或者“C...
    99+
    2022-09-21
  • julia怎么求出二维数组最大元素值
    求一个二维数组的最大元素值,可以通过遍历数组的每一个元素,比较它们的大小来找到最大值。以下是一个求二维数组最大元素值的示例代码:``...
    99+
    2023-09-21
    julia
  • matlab怎么求矩阵最大元素
    在Matlab中,可以使用`max`函数来求矩阵的最大元素。例如,假设有一个3x3的矩阵A,可以使用以下代码来求矩阵A的最大元素:`...
    99+
    2023-09-12
    matlab
  • php怎么求一个数组中大于0的元素个数
    实现步骤:1、使用array_filter()函数调用回调函数来过滤数组,返回大于0的元素,语法“function f($num){return($num>0);}$res=array_filter($arr,"f"...
    99+
    2022-08-19
    php php数组
  • ChatGPT中怎么用c语言求1-100之间素数
    这篇文章主要介绍“ChatGPT中怎么用c语言求1-100之间素数”,在日常操作中,相信很多人在ChatGPT中怎么用c语言求1-100之间素数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ChatGPT中怎...
    99+
    2023-07-04
  • php怎么求数组第一个元素的下标是什么
    两种实现方法:1、利用key()获取数组第一个元素的下标,语法“key(指定数组)”。2、使用“array_keys(原数组)”语句获取原数组的全部下标,返回包含全部下标的键名数组,再利用“$键名数组名[0]”语句获取键名数组的第一个元素值...
    99+
    2022-08-08
    php数组 php
  • php怎么求数组中最小的元素值和下标
    本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑分析:php求数组中最小的元素值和下标可以分成两步获取数组的最小的元素值(最小值)根据最小值来求该值在数组的对应下标(键名)下面就来给大家具体介绍一下实现步骤...
    99+
    2022-10-18
  • jquery数组元素如何求和
    这篇文章主要介绍“jquery数组元素如何求和”,在日常操作中,相信很多人在jquery数组元素如何求和问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jquery数组元素如何...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作