求素數(質數)的幾種算法對比


查找指定范圍的自然數的所有質數,實現起來並不難,但是哪種算法效率最高,速度最快才是重點,我列出幾種算法:

1、將待判斷的值與小於它而且不小於2的所有數求余數
public static List<Integer> getprimeV1(int max){
List<Integer> list = new ArrayList<>();
boolean flag;
int times = 0;
for(int i=2;i<=max;i++){
flag=false;
if(!flag) {
for (int j = 2; j < i; j++) {
times++;
if (i % j == 0) {
flag = true;
break;
}
}
}
if(!flag){
list.add(i);
}
}
System.out.println("循環次數:"+times);
return list;
}


2、將待判斷的值與比它小的所有素數求余數
public static List<Integer> getprimeV2(int max){
List<Integer> list = new ArrayList<>();
boolean flag;
int times = 0;
for(int i=2;i<=max;i++){
flag=false;
if(i>2){
for (Integer num : list) {
times++;
if(i%num==0) {
flag = true;
break;
}
}
}
if(!flag){
list.add(i);
}
}
System.out.println("循環次數:"+times);
return list;
}
3、將待判斷的值與不大於它的平方根而且不小於2的所有數求余數
public static List<Integer> getprimeV3(int max){
List<Integer> list = new ArrayList<>();
boolean flag;
int times = 0;
for(int i=2;i<=max;i++){
flag=false;
if(!flag) {
for (int j = 2; j <= Math.sqrt(i); j++) {
times++;
if (i % j == 0) {
flag = true;
break;
}
}
}
if(!flag){
list.add(i);
}
}
System.out.println("循環次數:"+times);
return list;
}
4、將待判斷的值與不大於它的平方根的所有素數求余數
public static List<Integer> getprimeV4(int max){
List<Integer> list = new ArrayList<>();
boolean flag;
int times = 0;
for(int i=2;i<=max;i++){
flag=false;
if(i>2){
for (int j=0;list.get(j)<=Math.sqrt(i);j++) {
times++;
if(i%list.get(j)==0) {
flag = true;
break;
}
}
}
if(!flag){
list.add(i);
}
}
System.out.println("循環次數:"+times);
return list;
}
針對以上四種算法:
1)當我傳入參數為100的時候,得到的循環次數從上往下分別為:
1133、411、236 、181,他們消耗的時間很短,沒有可比性,所以可以換一個大一點的參數測試;
2)當我傳入參數為1000000時,他們消耗的時間從上往下大概分別為:
150s,80s,0.8s,0.3s
從測試結果看,不同的算法,計算效率就是差別很大,學好算法,對於提高工作效率有很大的幫助。如有更好的算法,歡迎指正和補充,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM