用JavaScript如何判定和求100内的素数
Admin 2022-10-09 群英技术资讯 1391 次浏览
这篇文章将为大家详细讲解有关“用JavaScript如何判定和求100内的素数”的知识,下文有详细的介绍,小编觉得挺实用的,对大家学习或工作或许有帮助,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。
素数又叫质数,素数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。
100以内的素数:2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97,共计25个。
素数只能被1和自身整除,所以遍历(1,n)开区间中的所有自然数给n来除,若存在整除,即余数为0,则表示该数n不是素数,否则就是素数。
function isPrime(n) {
n = parseInt(n);
if (n <= 3) {
return n > 1;
}
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return false;
}
}
return true;
}但是这种算法的复杂度为O(n)
假设n不是素数,则n除了可以被1和n整除外,还可以被i、j整除,即 n / i = j...0,比如15不是素数,15 / 3 = 5,比如35不是素数,35 / 5 = 7,此时i,j必然分别处于(1, Math.sqrt(n)]和[Math.sqrt(n), n) 之中,比如Math.sqrt(15) ≈ 3.8,则 3处于(1,3.8],5处于[3.8, 15)。比如Math.sqrt(4) = 2,则2处于(1,2]中,也处于[2,4)中。
function isPrime(n) {
n = parseInt(n);
if (n <= 3) {
return n > 1;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false;
}
}
return true;
}此时算法复杂度为O(sqrt(n))
除了2,所有偶数都不是素数

function isPrime(n) {
n = parseInt(n);
if (n <= 3) {
return n > 1;
}
if (n % 2 === 0) {
return false;
}
for (let i = 3; i <= Math.sqrt(n); i += 2) {
if (n % i === 0) {
return false;
}
}
return true;
}for循环中n,只能为上图浅蓝色部分。
因此上面算法减少了一半的循环,时间复杂度为O(sqrt(n) / 2)
需要注意的是,本算法的代码不能将n % 2 === 0 的判断条件加入到循环中,如下代码存在漏洞
function isPrime(n) {
n = parseInt(n);
if (n <= 3) {
return n > 1;
}
for (let i = 3; i <= Math.sqrt(n); i += 2) {
if (n % 2 === 0 || n % i === 0) {
return false;
}
}
return true;
}此时4、6、8都会被判定为素数。
漏洞形成的原因是,for循环的循环条件 i <= Math.sqrt(n) 不成立,比如n=4时,i <= Math.sqrt(4) 不成立,导致n无法进入循环中n % 2 === 0 的判断,而是直接退出循环,return true。
该算法只能保证循环条件 i <= Math.sqrt(n) 成立的n值判断素数正确,即 n >= i^2 = 9 时。
大于等于5的素数一定和6的倍数相邻
(注意这句话不等价于:和6的倍数相邻的数一定是大于5的素数,该结论不成立。)

如上图中,将大于等于5的数分为了:6y-1、6y、6y+1、6y+2、6y+3、6y+4(y>=1)
其中,6y、6y+2、6y+3、6y+4都不可能是素数,只有6y-1和6y+1可能是素数。
另外,6y-1(y>=1)和 6y + 5 (y>=0)等价。
所以,我们可以将n不为6y-1(或6y+5)和6y+1的数直接排除,排除方法为,
if (n % 6 !== 1 && n % 6 !== 5) {
return false;
}下面要剔除掉6y-1(或6y+5)和6y+1中的非素数,
for (let i = 5; i <= Math.sqrt(n); i += 6) {
if (n % i === 0 || n % (i + 2) === 0) {
return false;
}
}这里大家比较疑惑的可能有两点:

我们看上面图解,可以发现,6y-1,是基数为5,差值为6的等差数列,即 5 + 6x :
6y+1,是基数为7,差值为6的等差数列,即 7 + 6x :
所以6y-1和6y+1可能整除的数自增量为6,这是for循环i自增为啥是 6的原因
且6y-1和6y+1的整除数基数为5和7,相差为2,这是for循环中素数判定的条件为啥是 n % i === 0 || n % (i+2) === 0的原因
function isPrime(n) {
n = parseInt(n);
if (n <= 3) {
return n > 1;
}
if (n % 6 !== 1 && n % 6 !== 5) {
return false;
}
for (let i = 5; i <= Math.sqrt(n); i += 6) {
if (n % i === 0 || n % (i + 2) === 0) {
return false;
}
}
return true;
}此时时间复杂度为 O(sqrt(n) / 3)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录正文npm2yarnpnpm总结正文大家最近是不是经常听到 pnpm,我也一样。今天研究了一下它的机制,确实厉害,对 yarn 和 npm 可以说是降维打击。那具体好在哪里呢? 我们一起来看一下。我们按照包管理工具的发展历史,从 npm2 开始讲起:npm2用 node 版本管理工具把 node 版本降到 4,那
在jquery中,可以使用hasClass()方法来判断是否有某个class,该方法的作用就是检查被选元素是否包含指定的class,语法“$(selector).hasClass(classname)”。
本文实例为大家分享了JS实现二级菜单效果的具体代码,供大家参考,具体内容如下
目录前言一、作用域(scope)1、作用域的分类二、预编译三、作用域链前言我们需要先知道的是引擎,引擎的工作简单粗暴,就是负责javascript从头到尾代码的执行。引擎的一个好朋友是编译器,主要负责代码的分析和编译等;引擎的另一个好朋友就是今天的主角--作用域。那么作用域用来干什么呢?作用域链跟作用域又有什么关系呢?
在react中的三大属性有state、props、refs,这篇文章给大家分享的是有关react的refs属性的内容,小编觉得挺实用的,因此分享给大家做个参考,接下来一起跟随小编看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008