(编辑:jimmy 日期: 2025/9/30 浏览:2)
前言
今天看到一个题目,让判断一个数字是否为质数.看上去好像不难.因此,我决定实现一下.
DOM结构
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>计算500以内的质数并输出</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <script src="/UploadFiles/2021-04-02/jquery.min.js">如上所示,我们通过 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 "background-color: #ffff00">如果不是数字或者整数的处理如果用户输入的不是数字,或者是一个小数,怎么办呢"htmlcode">
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 "background-color: #ffff00">去除能被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 "htmlcode">if (num==2||num==3||num==5) {return true;}别人的方法
然后我就想不到优化的方法啦…于是,我就搜索了一下,找到下面的解决方法,我惊呆了!!!!!
function isPrimeNum2(num){ return !/^."color: #ff0000">补充看了一些相关的资料,好像我上面用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 "text-align: center">![]()
以上所述是小编给大家介绍的JavaScript判断数字是否为质数的方法汇总,希望对大家有所帮助.
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?