JavaScript判断数字是否为质数的方法汇总


Posted in Javascript onJune 02, 2016

前言

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

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="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) 函数,来实现判断是否为质数.下面我们来实现这个函数.

通过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)求平方根的方式.

我的代码的测试结果如下

JavaScript判断数字是否为质数的方法汇总

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

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

JavaScript判断数字是否为质数的方法汇总

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

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

JavaScript判断数字是否为质数的方法汇总

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

最终,代码如下:

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判断数字是否为质数的方法汇总

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

Javascript 相关文章推荐
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
Nov 20 Javascript
jquery操作select option 的代码小结
Jun 21 Javascript
JQuery触发事件例如click
Sep 11 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
Oct 23 Javascript
Node.js实现文件上传
Jul 05 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
Oct 08 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
Bootstrap CSS组件之大屏幕展播
Dec 17 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
详解小程序用户登录状态检查与更新实例
May 15 Javascript
angularjs请求数据的方法示例
Aug 06 Javascript
Jquery on方法绑定事件后执行多次的解决方法
Jun 02 #Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
Jun 02 #Javascript
Javascript小技能总结(推荐)
Jun 02 #Javascript
Jquery为DIV添加click事件的简单实例
Jun 02 #Javascript
jquery中取消和绑定hover事件的实现代码
Jun 02 #Javascript
深入理解jQuery之事件移除
Jun 02 #Javascript
深入理解JQuery循环绑定事件
Jun 02 #Javascript
You might like
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
JS 分号引起的一段调试问题
2009/06/18 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
three.js利用射线Raycaster进行碰撞检测
2020/03/12 Javascript
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python dumps和loads区别详解
2020/02/04 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
自荐信范文
2013/12/10 职场文书
单位单身证明范本
2014/01/11 职场文书
小小商店教学反思
2014/04/27 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
2014年教务处工作总结
2014/12/03 职场文书
三年级学生期末评语
2014/12/26 职场文书
团组织关系介绍信
2019/06/24 职场文书