宝哥软件园

JavaScript判断数字是否为质数的方法概述

编辑:宝哥软件园 来源:互联网 时间:2021-10-28

今天看到一个话题,判断一个数是否是质数似乎并不难。因此,我决定实施它。

DOM结构

!doctype html lang=' en ' head meta charset=' utf-8 ' title计算500以内的质数并输出/title meta name=' viewport ' content=' width=device-width,initial-scale=1.0。max-scale=1.0,user-scalable=0 ' script src=' http :http://apps . bdimg.com/libs/jquery/2 . 1 . 4/jquery . min . js '/script/Headydiv class=' echo ' input type=' text ' id=' num ' value=' input type=' button ' id=' submit ' value=' submit '/div/body/html script $(function(){ $(' # submit ')。打开('点击'。If (isPrimeNum(num)) {alert(num '是质数');}else{alert(num '是一个复合数字');}});});/script如上所示,我们使用isPrimeNum(num)函数来确定它是否是素数。让我们实现这个函数。

通过FOR循环确定它是否是素数。

函数isPrimeNum(num){ for(var I=2;i numI){ if(num % I==0){ return false;}};返回真;}

原理比较简单,余数是通过2以上的数字不断计算目标数。如果能得到0,说明它是一个复合数,而不是质数。

不过,这个计算似乎有点重。

优化第一种方法。

很简单,一下就实现了。不过好像可以优化一下。看来我们不用一直追这个数去找余数了。似乎我们只需要循环到这个数的一半,就可以算出这个数是不是质数。

函数isPrimeNum(num){ for(var I=2;I num/2 1;I){ if(num % I==0){ return false;}};返回真;}经过实测,速度确实大大提高了,但是我知道如果尾数是偶数或者5,那肯定不是质数,所以不用计算。我们再优化一下。

不要数尾数为偶数或5的数字。

函数isPrimeNum(num){if(!is dual(num)){ return false;} for(var I=2;I num/2 1;I){ if(num % I==0){ return false;}};返回真;}函数IsDual(num){ var num=num . ToString();var LastNum=num . substring(num . length-1,num . length);返回lastNum%2==0 || lastNum%5==0?假:真;}通过这样的优化,我们可以再次减少计算量,至少减少一半以上的数字。(然而,测量的性能通常会得到改善,因为这样的数字可以很快被判断为不是素数)。

在这里,substring()函数发现它不能用于数字,而只能用于字符串。这是一个悲伤的提醒,所以先把数字变成字符串。

如果不是数字或整数的处理。

如果用户输入的不是数字或十进制怎么办?我很快写了两种方法来处理它…

函数isPrimeNum(num){if(!isNum(num)){ return false;}if(!is integer(num)){ return false;}if(!is dual(num)){ return false;} for(var I=2;I num/2 1;I){ if(num % I==0){ return false;}};返回真;}函数is integer(num){ return num==~ ~ num?真:假;}函数isNum(num){return num==num?真:假;}函数IsDual(num){ var num=num . ToString();var LastNum=num . substring(num . length-1,num . length);返回lastNum%2==0 || lastNum%5==0?假:真;}这里使用了两个技巧,一个是小数舍入~~num,另一个是字符串到数字。

更多信息,请阅读我之前的博文《javascript 学习小结 JS装逼技巧(一) by FungLeo》。

这并没有提高效率,只是省略了计算误差的输入。我们再想想,有没有什么快速的方法可以判断它不是质数?

移除可被3整除的数字不计算在内。

函数isPrimeNum(num){if(!isNum(num)){ return false;}if(!is integer(num)){ return false;} if(num==2 | | num==3 | | num==5){返回true}if(!is dual(num)){ return false;}if(!is tree(num)){ return false;} for(var I=2;I num/5 1;I){ if(num % I==0){ return false;}};返回真;}函数is integer(num){ return num==~ ~ num?真:假;}函数isNum(num){return num==num?真:假;}函数IsDual(num){ var num=num . ToString();var LastNum=num . substring(num . length-1,num . length);返回lastNum%2==0 || lastNum%5==0?假:真;}函数Isthree(num){ var str=num . ToString();var sum=0;for(var I=0;I字符串长度;i ) {sum=str.substring(i,I ^ 1);};返回总和%3==0?假:真;}这里我们先把数字变成一个字符串,然后把字符串的每一位拆分,相加求和,取结果和3求余数,然后就可以知道这个数字是否能被3整除。

哈哈,我太聪明了…实测成绩好像没怎么提高,但是提高了一点。有点压抑。

但是,如果排除了能被3整除的数,那么就不需要计算到一半,不需要计算到一半,只需要计算到三分之一。此外,我们还排除了5,所以我们只需要计算到五分之一.

经过快速调整,效率大大提高!我很强大.

但是这样,代码会判断235中的三个质数是复合数,所以需要再加一句。

if(num==2 | | num==3 | | num==5){返回true}别人的方法。

然后我想不出一个优化的方法…于是我搜索了一下,找到了下面的解,我惊呆了!

函数isPrimeNum2(num){return!/^.$|^(.) 1 $/.测试(数组(num1)。join(' 1 ')}用的是正规的方法,真的很短,但我能读懂和理解毛线!

我真的不明白这个原理,所以我测量了一下,发现我的代码比这个代码效率高很多。所以,我的方法还是很优秀的!

我的代码需要1600ms才能打印出这个代码100,000和160,000 ms内的所有质数,也就是说,我的代码只需要1%的时间。

不过,谁能看懂这个代码,请帮我解释一下。

补充

看了一些相关数据,上面我用num/5的方式好像不是很好(结果没有错)。更好的方法是用Math.sqrt(num)求平方根。

我的代码的测试结果如下。

num/5+1计算质数方式

如上图所示,我的代码计算结果完全正确,但需要1638毫秒。经过多次测试,情况依然如此。

平方根测试结果如下。

Math.sqrt(num)求平方根方式

如上图所示,这种方法更科学、更快速,多次测试耗时在1150毫秒到1250毫秒之间。与我的代码相比,性能提高了约25%。

我在试着判断数字是偶数还是5,能不能被3整除。我非常期待减少计算量。但是这些代码也是计算密集型的。删除所有代码后,我会查看它们。

去除我的优化代码之后的测试结果

性能又提高了。看来我所有的计算都是负优化!

最后,代码如下:

函数isPrimeNum(num){if(!isNum(num)){ return false;}if(!is integer(num)){ return false;} for(var I=2;I=Math . sqrt(num);I){ if(num % I==0){ return false;}};返回真;}函数is integer(num){ return num==~ ~ num?真:假;}函数isNum(num){return num==num?真:假;}总结:正是我糟糕的算术让我在自己面前变得聪明。不过,练习一下我的小技巧也不错-_-| | | |。

最后,看看计算100万以内的所有素数需要多长时间。

计算100万以内的所有质数

以上是边肖介绍的判断数字是否为质数的JavaScript方法的总结,希望对大家有所帮助。

更多资讯
游戏推荐
更多+