前言

今天看到一个题目,让判断一个数字是否为质数.看上去好像不难.因此,我决定实现一下.

DOM结构

计算500以内的质数并输出

$(function(){

$("#submit").on('click',function(){

var num = $("#num").val();

if (isPrimeNum(num)) {

alert(num+"是质数");

}else{

alert(num+"是合数");

}

});

});

如上所示,我们通过 isPrimeNum(num) 函数,来实现判断是否为质数.下面我们来实现这个函数.

通过FOR循环来判断是否为质数

function isPrimeNum(num){

for (var i = 2; i < num; i++) {

if (num%i==0){

return false;

}

};

return true;

}

原理比较简单,通过2以上的数字不断和目标数字求余数,如果能得到0,就表示这是一个合数而不是质数.

不过这个运算量好像有点大

优化一下第一个方法

很简单嘛,一下子就实现了.但是,好像可以优化一下.我们好像不必一直追到这个数字去求余数,我们好像只需要循环到这个数的一半,就可以计算出来这个数字是不是质数了.

function isPrimeNum(num){

for (var i = 2; i < num/2+1; i++) {

if (num%i==0){

return false;

}

};

return true;

}

经过实测,速度确实大为提升,但是,我知道,数字尾数为双数,或者为5,那么肯定不是质数,因此没必要去计算.我们再来优化一下

不计算数字尾数为双数或者5的数字

function isPrimeNum(num){

if (!isDual(num)){

return false;

}

for (var i = 2; i < num/2+1; i++) {

if (num%i==0){

return false;

}

};

return true;

}

function isDual(num){

var num = num.toString();

var lastNum = num.substring(num.length-1,num.length);

return lastNum%2 == 0 || lastNum%5 == 0 ? false : true;

}

通过这样的优化,我们可以再减小运算量了,至少减少一大半数字哦.(但是实测提升性能一般,因为这样的数字,能够很快的判断出来不是质数)

这里substring()函数发现,不能用在数字上,只能用在字符串上.悲催,因此先把数字变成了字符串.

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

如果用户输入的不是数字,或者是一个小数,怎么办呢?我迅速的写了两个方法来进行处理…

function isPrimeNum(num){

if (!isNum(num)){

return false;

}

if (!isInteger(num)){

return false;

}

if (!isDual(num)){

return false;

}

for (var i = 2; i < num/2+1; i++) {

if (num%i==0){

return false;

}

};

return true;

}

function isInteger(num){

return num == ~~num ? true : false;

}

function isNum(num){

return num == +num ? true : false;

}

function isDual(num){

var num = num.toString();

var lastNum = num.substring(num.length-1,num.length);

return lastNum%2 == 0 || lastNum%5 == 0 ? false : true;

}

这里用了两个小技巧,一个是小数取整~~num,一个是字符串转数字.+num.

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

这并没有提高什么效能,只是免去了计算错误输入.我们再想一下,有没有什么快速判断不是质数的方法呢?

去除能被3整除的数字不计算

function isPrimeNum(num){

if (!isNum(num)){

return false;

}

if (!isInteger(num)){

return false;

}

if (num==2||num==3||num==5) {

return true;

}

if (!isDual(num)){

return false;

}

if (!isThree(num)){

return false;

}

for (var i = 2; i < num/5+1; i++) {

if (num%i==0){

return false;

}

};

return true;

}

function isInteger(num){

return num == ~~num ? true : false;

}

function isNum(num){

return num == +num ? true : false;

}

function isDual(num){

var num = num.toString();

var lastNum = num.substring(num.length-1,num.length);

return lastNum%2 == 0 || lastNum%5 == 0 ? false : true;

}

function isThree(num){

var str = num.toString();

var sum = 0;

for (var i = 0; i < str.length; i++) {

sum += +str.substring(i,i+1);

};

return sum%3 == 0 ? false : true;

}

这里,我们先把数字变成字符串,然后把字符串每一位都分拆出来,并且相加求和,拿结果和3求余,就能得出这个数字是否能被3整除了.

哈哈我真聪明…实测性能貌似并没有提高很多,但确实提高了一些的.有点小郁闷

但是,如果排除了3整除的数字,那么,我们就完全没必要计算到一半啦,我们完全没必要计算到一半,只需要计算到三分之一就好啦.另外,我们也排除了5,那么只要计算到五分之一就好啦….

迅速调整后,果然效率大大提升啊!!!!我威武…

但是,这样在 2\3\5 三个质数,代码会判断是合数,所以,需要再补上一句

if (num==2||num==3||num==5) {return true;}

别人的方法

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

function isPrimeNum2(num){

return !/^.?$|^(..+?)\1+$/.test(Array(num + 1).join('1'))

}

使用的是正则的方法,果然是简短啊,但是我毛线也看看懂呀!!!

我实在是搞不懂这是啥原理,我于是实测了一下,发现,我的代码效率远远高于这段代码.由此可见,我的方法还是很优秀的嘛!!

我的代码打印100000以内的所有质数需要1600ms 而这段代码需要160000ms 也就是说,我的代码只要百分之一的时间就可以了.

不过,谁能看懂这段代码请帮我解释一下….

补充

看了一些相关的资料,好像我上面用num/5的方式貌似不太好(结果并不是错误的).有一个更好的方式,就是使用Math.sqrt(num)求平方根的方式.

我的代码的测试结果如下

如上图所示,我的代码的计算结果是完全正确的哦.但是用时是1638毫秒.经过多次测试依然是这样.

求平方根方式测试结果如下

如上图所示,用这个方式更加科学,速度更快,多次测试,用时在1150毫秒到1250毫秒之间.相比我的代码性能提升大约25%.

我又是判断位数是否是双数或者5的,又是判断加起来能不能被3整除的,折腾半天.我肯定是期望减少运算量的.但是这些代码本身也是有运算量的.我把我的代码都去除掉之后再看下

性能又得到了提升啊,看来我的那些计算全部都是负优化啊!

最终,代码如下:

function isPrimeNum(num){

if (!isNum(num)){

return false;

}

if (!isInteger(num)){

return false;

}

for (var i = 2; i <= Math.sqrt(num); i++) {

if (num%i==0){

return false;

}

};

return true;

}

function isInteger(num){

return num == ~~num ? true : false;

}

function isNum(num){

return num == +num ? true : false;

}

小结:完全是我算术不好导致我在前面各种自作聪明.不过,练练小技巧也是好的-_-|||

最后看下计算100万以内的所有质数需要多长时间

以上所述是小编给大家介绍的JavaScript判断数字是否为质数的方法汇总,希望对大家有所帮助.

用js代码判断质数_JavaScript判断数字是否为质数的方法汇总相关推荐

  1. js 比较时分大小_JavaScript 判断时间大小(时分)

    小编是写了自定义的时分,并没有用到Date()方法,如果小伙伴们需要用到Date()方法做判断的话,那就用Date()方法转换了. 这个方法主要是用split()方法进行分割. 代码演示 //开始时间 ...

  2. python判断正负零_javascript 判断正负0

    ES 2015/ ES 6 新增了一个方法用于 javascript 相等性判断 – Object.is().它与之前的相等比较运算符有什么不同呢? 三种不同的值比较操作抽象相等比较 (==):将执行 ...

  3. python英文词频统计代码_python实现中文和英文的词频统计功能方法汇总

    python的思维就是让我们用尽可能少的代码来解决问题.对于词频的统计,就代码层面而言,实现的方式也是有很多种的.之所以单独谈到统计词频这个问题,是因为它在统计和数据挖掘方面经常会用到,尤其是处理分类 ...

  4. JS删除数组中某一项或几项的方法汇总

    2019独角兽企业重金招聘Python工程师标准>>> 1.JS中的splice方法 splice(index, len, [item])    //注意:该方法会改变原始数组. s ...

  5. html js 点击隐藏div,javascript实现显示和隐藏div方法汇总

    javascript实现显示和隐藏div方法汇总 15种方法实现div显示和隐藏 body{ margin: 0; } h1,h2{ margin: 0; } ul{ margin: 0; paddi ...

  6. 工欲善其事必先利其器系列之:在VS里面折叠js代码

    之前用vs写js的时候经常因为js代码过长而且不能像cs文件里面的方法一样进行折叠而抓狂,直到在扩展库发现了这款插件有了它就可以把代码进行折叠了 插件地址 转载于:https://www.cnblog ...

  7. 新版天猫刷红包js代码以及使用方式增加砸金砖代码

    来自我的个人博客:http://zucou.com/html/2709313416.html 因为是1块钱空间,速度很慢,望见谅,够不做广告不靠流量,纯属兴趣 tmall 617号改了 规则,其实就是 ...

  8. js代码实现打印九九乘法表

    js代码实现九九乘法表的打印 当然实现的方法有很多种,在这里我就分享一下我用的几种方式(废话不多说,直接上代码!!!) 一.首先是输出在页面的代码 <script>for (var i = ...

  9. php判断是否safari,js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本_javascript技巧...

    因为ie10-ie11的版本问题,不再支持document.all判断,所以ie判断函数要重新写了 function isIE() { //ie? if (!!window.ActiveXObject ...

最新文章

  1. 【转】PHP获取重定向URL的几种方法
  2. JavaScript正则表达式在线测试工具
  3. springboot读取json文件_SpringBoot:配置文件属性读取
  4. Git 修改分支的名称(亲测)
  5. 微软2014编程之美初赛第一场——题目3 : 活动中心
  6. C语言编程基础 打印图形
  7. java 查询solr_java实现简单的solr查询
  8. 理解快速傅里叶变换(FFT)算法
  9. Git学习总结(21)——Git 提交规范总结
  10. 最小成本排序:两种情况
  11. php动态页面在ie浏览器中css布局板块全缩在中间,CSS网页布局开发时的常见问题及解决方法...
  12. [jzoj NOIP2018模拟11.02]
  13. Node.js 解压版 安装配置
  14. catia怎么进入装配_catia装配详细教程
  15. instagram授权流程(第二篇)
  16. cloudchat苹果如何下载只能通过ipa吗
  17. python三重积分_(整理)三重积分及其计算和多重积分.
  18. 安卓使用opengles显示深度点云图或深度3D效果图
  19. 配置网卡和修改ip地址
  20. selenium简介,原理,优点,工作过程,定位方式

热门文章

  1. umeditor 踩坑
  2. 蚂蚁金服 最新前端面试 内容
  3. mahout程序和java web_mahout及java编写mapreduce
  4. 【秒懂】号称最为简明实用的Django上手教程(下)
  5. 攻城狮生活-4 高架桥惊魂一幕
  6. ios android 一键换机,‎App Store 上的“手机搬家 - 一键换机助手”
  7. python将自定义模块加入python系统库
  8. python爬取今日头条瀑布流_火车头采集今日头条教程,含视频教程!自行下载
  9. IPCamera监控软件如何支持joystick遥控手柄控制云台
  10. 计算机辅助设计rhino实训,计算机辅助设计实训.doc