<!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="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script></head><body><div class="echo"><input type="text" id="num" value=""><input type="button" id="submit" value="提交"></div></body></html><script>$(function(){$("#submit").on("click",function(){var num = $("#num").val();if (isPrimeNum(num)) {alert(num+"是质数");}else{alert(num+"是合数");}});});</script>如上所示,我们通过 isPrimeNum(num) 函数,来实现判断是否为质数.下面我们来实现这个函数.function isPrimeNum(num){for (var i = 2; i < num; i++) {if (num%i==0){return false;}};return true;}function isPrimeNum(num){for (var i = 2; i < num/2+1; i++) {if (num%i==0){return false;}};return true;}经过实测,速度确实大为提升,但是,我知道,数字尾数为双数,或者为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;}通过这样的优化,我们可以再减小运算量了,至少减少一大半数字哦.(但是实测提升性能一般,因为这样的数字,能够很快的判断出来不是质数)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.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整除了.if (num==2||num==3||num==5) {return true;}别人的方法function isPrimeNum2(num){return !/^.?$|^(..+?)1+$/.test(Array(num + 1).join("1"))}使用的是正则的方法,果然是简短啊,但是我毛线也看看懂呀!!!
如上图所示,我的代码的计算结果是完全正确的哦.但是用时是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;}小结:完全是我算术不好导致我在前面各种自作聪明.不过,练练小技巧也是好的-_-|||
以上所述是小编给大家介绍的JavaScript判断数字是否为质数的方法汇总,希望对大家有所帮助.