質數又叫素數,是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。
常見方法
根據質數定義用小於i大於1的所有數對變數i進行取餘,若只有變數i本身能取余為0則說明變數i為質數。
**如下:
("所用時間"
+(end - start)
+"ms");
}}輸出結果:
由於數量過小所以計算時間為0ms,此時要將100改為10萬,由於列印輸出也需要處理時間,所以僅計算質數個數
**如下:
}//若標誌還為真,這證明該數是質數
if(flag ==
true
) flag =
true;}
long end = system.
currenttimemillis()
; system.out.
println
("所用時間"
+(end - start)
+"ms");
system.out.
println
("質數個數:"
+count);}
}看似計算結果用時不久,但這只是10萬內的質數,若要求的是100萬,用時就已經是非常久了,我等了好久也沒算出來,所以要對該程式演算法進行優化
優化一:
若變數i已經被除盡則無需再繼續下去,應當及時跳出迴圈。
public
class
zhishu
}//若標誌還為真,這證明該數是質數
if(flag ==
true
) flag =
true;}
long end = system.
currenttimemillis()
; system.out.
println
("所用時間"
+(end - start)
+"ms");
system.out.
println
("質數個數:"
+count);}
}
計算結果:
可以很明顯的看到,經過演算法優化後用時大大減少,但對於100萬的資料依然需要非常久的時間,我也是沒有等出來。
優化二:
這是就需要從變數i要除的數進行優化,我們都知道質數除了2之外都是奇數,這相當於減少了一半的計算量,但是這遠遠不夠。這時我們就可以對i進行開根,這樣計算量就會大大減少。
**如下:
public
class
zhishu
}//若標誌還為真,這證明該數是質數
if(flag ==
true
) flag =
true;}
long end = system.
currenttimemillis()
; system.out.
println
("所用時間"
+(end - start)
+"ms");
system.out.
println
("質數個數:"
+count);}
}
計算結果:
優化演算法後的所用時間僅為13ms,這比不進行優化的時間減少了非常非常多。
使用continue對程式進行重構
public
class
zhishu
}//能到執行到這的都是質數
count++;}
long end = system.
currenttimemillis()
; system.out.
println
("所用時間"
+(end - start)
+"ms");
system.out.
println
("質數個數:"
+count);}
}
計算結果:
使用優化後的演算法對1000萬以內的質數進行計算
**如下:
public
class
zhishu
}//能到執行到這的都是質數
count++;}
long end = system.
currenttimemillis()
; system.out.
println
("所用時間"
+(end - start)
+"ms");
system.out.
println
("質數個數:"
+count);}
}
將100以內的所有質數輸出
方法一 方法一 根據質數的定義得出的方法 public static void isprimenumber2 方法二 方法二 這個 用了兩層迴圈。外層迴圈列舉從2 100之間的每乙個整數 作為被除數 然後在內層迴圈中用從2到它之間的數去除它,如果找到了乙個能夠整除它的數,內層迴圈將立即跳出 此時j....
列印100以內的質數及優化
public class demo3 優化方式一 遇到第乙個j 能整除 i 就退出迴圈,不用執行其他的 i j 只對本身是非質數的自然數起到優化作用 break if flag true 重置 flag 為true flag true 獲取當前時間距離1970 01 01 00 00 00的毫秒數 ...
python 求100以內素數 質數和
import math def is prime n 簡化問題,先利用函式判斷是否為質數 if n 1 是賦值,才是判斷,切記切記 return false for i in range 2,int math.sqrt n 1 質數判斷條件,注意 1 if n i 0 return false re...