国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript判斷數字是否為質數的方法匯總

2019-11-20 09:49:27
字體:
來源:轉載
供稿:網友

前言

今天看到一個題目,讓判斷一個數字是否為質數.看上去好像不難.因此,我決定實現一下.

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

我的代碼的測試結果如下

num/5+1計算質數方式

如上圖所示,我的代碼的計算結果是完全正確的哦.但是用時是1638毫秒.經過多次測試依然是這樣.

求平方根方式測試結果如下

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

如上圖所示,用這個方式更加科學,速度更快,多次測試,用時在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萬以內的所有質數需要多長時間

計算100萬以內的所有質數

以上所述是小編給大家介紹的JavaScript判斷數字是否為質數的方法匯總,希望對大家有所幫助.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 道真| 龙南县| 清远市| 博白县| 建德市| 宁化县| 姜堰市| 镇江市| 克什克腾旗| 慈利县| 自贡市| 买车| 邳州市| 卓资县| 寿宁县| 舒城县| 抚宁县| 久治县| 巴彦淖尔市| 曲松县| 沛县| 浠水县| 新疆| 平乐县| 武胜县| 辰溪县| 原平市| 准格尔旗| 桐柏县| 久治县| 米脂县| 文水县| 临泽县| 吴川市| 潼关县| 富锦市| 腾冲县| 吴江市| 铜梁县| 灌南县| 松阳县|