最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript判斷數(shù)字是否為質(zhì)數(shù)的方法匯總

 更新時間:2016年06月02日 11:04:08   作者:FungLeo  
這篇文章主要介紹了JavaScript判斷數(shù)字是否為質(zhì)數(shù)的方法匯總的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下

前言

今天看到一個題目,讓判斷一個數(shù)字是否為質(zhì)數(shù).看上去好像不難.因此,我決定實現(xiàn)一下.

DOM結(jié)構(gòu)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>計算500以內(nèi)的質(zhì)數(shù)并輸出</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+"是質(zhì)數(shù)");
}else{
alert(num+"是合數(shù)");
}
});
});
</script>

如上所示,我們通過 isPrimeNum(num) 函數(shù),來實現(xiàn)判斷是否為質(zhì)數(shù).下面我們來實現(xiàn)這個函數(shù).

通過FOR循環(huán)來判斷是否為質(zhì)數(shù)

function isPrimeNum(num){
for (var i = 2; i < num; i++) {
if (num%i==0){
return false;
}
};
return true;
}

原理比較簡單,通過2以上的數(shù)字不斷和目標(biāo)數(shù)字求余數(shù),如果能得到0,就表示這是一個合數(shù)而不是質(zhì)數(shù).

不過這個運算量好像有點大

優(yōu)化一下第一個方法

很簡單嘛,一下子就實現(xiàn)了.但是,好像可以優(yōu)化一下.我們好像不必一直追到這個數(shù)字去求余數(shù),我們好像只需要循環(huán)到這個數(shù)的一半,就可以計算出來這個數(shù)字是不是質(zhì)數(shù)了.

function isPrimeNum(num){
for (var i = 2; i < num/2+1; i++) {
if (num%i==0){
return false;
}
};
return true;
}

經(jīng)過實測,速度確實大為提升,但是,我知道,數(shù)字尾數(shù)為雙數(shù),或者為5,那么肯定不是質(zhì)數(shù),因此沒必要去計算.我們再來優(yōu)化一下

不計算數(shù)字尾數(shù)為雙數(shù)或者5的數(shù)字

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;
}

通過這樣的優(yōu)化,我們可以再減小運算量了,至少減少一大半數(shù)字哦.(但是實測提升性能一般,因為這樣的數(shù)字,能夠很快的判斷出來不是質(zhì)數(shù))

這里substring()函數(shù)發(fā)現(xiàn),不能用在數(shù)字上,只能用在字符串上.悲催,因此先把數(shù)字變成了字符串.

如果不是數(shù)字或者整數(shù)的處理

如果用戶輸入的不是數(shù)字,或者是一個小數(shù),怎么辦呢?我迅速的寫了兩個方法來進(jìn)行處理…

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;
}

這里用了兩個小技巧,一個是小數(shù)取整~~num,一個是字符串轉(zhuǎn)數(shù)字.+num.

了解更多請閱讀我之前的博文《javascript 學(xué)習(xí)小結(jié) JS裝逼技巧(一) by FungLeo》

這并沒有提高什么效能,只是免去了計算錯誤輸入.我們再想一下,有沒有什么快速判斷不是質(zhì)數(shù)的方法呢?

去除能被3整除的數(shù)字不計算

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;
}

這里,我們先把數(shù)字變成字符串,然后把字符串每一位都分拆出來,并且相加求和,拿結(jié)果和3求余,就能得出這個數(shù)字是否能被3整除了.

哈哈我真聰明…實測性能貌似并沒有提高很多,但確實提高了一些的.有點小郁悶

但是,如果排除了3整除的數(shù)字,那么,我們就完全沒必要計算到一半啦,我們完全沒必要計算到一半,只需要計算到三分之一就好啦.另外,我們也排除了5,那么只要計算到五分之一就好啦….

迅速調(diào)整后,果然效率大大提升啊!!!!我威武…

但是,這樣在 2\3\5 三個質(zhì)數(shù),代碼會判斷是合數(shù),所以,需要再補(bǔ)上一句

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

別人的方法

然后我就想不到優(yōu)化的方法啦…于是,我就搜索了一下,找到下面的解決方法,我驚呆了!!!!!

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

使用的是正則的方法,果然是簡短啊,但是我毛線也看看懂呀!!!

我實在是搞不懂這是啥原理,我于是實測了一下,發(fā)現(xiàn),我的代碼效率遠(yuǎn)遠(yuǎn)高于這段代碼.由此可見,我的方法還是很優(yōu)秀的嘛!!

我的代碼打印100000以內(nèi)的所有質(zhì)數(shù)需要1600ms 而這段代碼需要160000ms 也就是說,我的代碼只要百分之一的時間就可以了.

不過,誰能看懂這段代碼請幫我解釋一下….

補(bǔ)充

看了一些相關(guān)的資料,好像我上面用num/5的方式貌似不太好(結(jié)果并不是錯誤的).有一個更好的方式,就是使用Math.sqrt(num)求平方根的方式.

我的代碼的測試結(jié)果如下

num/5+1計算質(zhì)數(shù)方式

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

求平方根方式測試結(jié)果如下

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

如上圖所示,用這個方式更加科學(xué),速度更快,多次測試,用時在1150毫秒到1250毫秒之間.相比我的代碼性能提升大約25%.

我又是判斷位數(shù)是否是雙數(shù)或者5的,又是判斷加起來能不能被3整除的,折騰半天.我肯定是期望減少運算量的.但是這些代碼本身也是有運算量的.我把我的代碼都去除掉之后再看下

去除我的優(yōu)化代碼之后的測試結(jié)果

性能又得到了提升啊,看來我的那些計算全部都是負(fù)優(yōu)化啊!

最終,代碼如下:

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;
}

小結(jié):完全是我算術(shù)不好導(dǎo)致我在前面各種自作聰明.不過,練練小技巧也是好的-_-|||

最后看下計算100萬以內(nèi)的所有質(zhì)數(shù)需要多長時間

計算100萬以內(nèi)的所有質(zhì)數(shù)

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

相關(guān)文章

  • HTML文檔引入JS模塊出現(xiàn)路徑問題解決辦法

    HTML文檔引入JS模塊出現(xiàn)路徑問題解決辦法

    這篇文章主要給大家介紹了關(guān)于HTML文檔引入JS模塊出現(xiàn)路徑問題的解決辦法,在HTML中引入JavaScript模塊時如果遇到路徑問題,通常是因為模塊的引用路徑不正確,本文將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • JS回調(diào)函數(shù)簡單用法示例

    JS回調(diào)函數(shù)簡單用法示例

    這篇文章主要介紹了JS回調(diào)函數(shù)簡單用法,結(jié)合實例形式分析了js回調(diào)函數(shù)的定義與簡單使用方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • JS for...in 遍歷語句用法實例分析

    JS for...in 遍歷語句用法實例分析

    這篇文章主要介紹了JS for...in 遍歷語句用法,結(jié)合實例形式分析了javascript的for...in語句進(jìn)行數(shù)組遍歷的具體流程與使用技巧,需要的朋友可以參考下
    2016-08-08
  • QRCode.js二維碼生成并能長按識別

    QRCode.js二維碼生成并能長按識別

    這篇文章主要為大家詳細(xì)介紹了QRCode.js二維碼生成并能長按識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺析JavaScript 函數(shù)防抖和節(jié)流

    淺析JavaScript 函數(shù)防抖和節(jié)流

    這篇文章主要介紹了JavaScript 函數(shù)防抖和節(jié)流的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 原生javascript實現(xiàn)分享到朋友圈功能 支持ios和android

    原生javascript實現(xiàn)分享到朋友圈功能 支持ios和android

    本文主要介紹網(wǎng)上一個牛人寫的js可以實現(xiàn)在UC瀏覽器和QQ瀏覽器中調(diào)用瀏覽器內(nèi)置的分享組件進(jìn)行分享。
    2016-05-05
  • JavaScript之class繼承_動力節(jié)點Java學(xué)院整理

    JavaScript之class繼承_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了JavaScript之class繼承,新的關(guān)鍵字class從ES6開始正式被引入到JavaScript中。class的目的就是讓定義類更簡單,有興趣的可以了解一下
    2017-07-07
  • 微信小程序連續(xù)簽到7天積分獲得功能的示例代碼

    微信小程序連續(xù)簽到7天積分獲得功能的示例代碼

    今天通過一個案例給大家分享微信小程序連續(xù)簽到7天積分獲得功能,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考價值,感興趣的朋友一起學(xué)習(xí)吧
    2020-08-08
  • JS如何實現(xiàn)動態(tài)添加的元素綁定事件

    JS如何實現(xiàn)動態(tài)添加的元素綁定事件

    這篇文章主要介紹了JS如何實現(xiàn)動態(tài)添加的元素綁定事件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 淺談async、defer以普通script加載的區(qū)別

    淺談async、defer以普通script加載的區(qū)別

    本文主要介紹了淺談async、defer以普通script加載的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論

榆社县| 当雄县| 苍梧县| 大港区| 黑山县| 会昌县| 陇川县| 阜康市| 雷波县| 昌乐县| 大冶市| 烟台市| 泗洪县| 峡江县| 晋州市| 金阳县| 临邑县| 延边| 昌都县| 新兴县| 荥阳市| 临汾市| 重庆市| 平度市| 嵊泗县| 庄浪县| 宜川县| 汝南县| 裕民县| 辉县市| 普定县| 竹溪县| 剑阁县| 河北省| 保德县| 鱼台县| 尼木县| 香河县| 明水县| 连城县| 梅州市|