1. 程式人生 > >關於java實現的求素數的幾種方法

關於java實現的求素數的幾種方法

經過一番艱難的思想鬥爭,覺得自己並不想學習網路,懷疑自己入錯了坑!我想了很久想的我頭暈目眩,想的我茶不思,飯不想;想的我不想再想;

走路在想,上課在想,下課在想,睡覺在想,就連拉屎也不得不想,,最後還是決定學習Android開發,不管我的選擇是否正確,何況本就沒有正確一說,正確與錯都只是那些成功者對我們訴說的故事而已!至少我現在不後悔,現在不會以後也不會,因為這就是我的選擇;

而且就算是別人認為我錯了那又怎麼樣,我不在乎再一次展示一下自己的狼狽;

現在什麼也不想,什麼也不說,什麼也不幹;一心一意學習此番;

希望假以時日,我也可以在別人迷茫的時候,可以坦然的寫出自己的故事,然後甩下筆尖,悠然離去,而心中那一份精神卻是無人能懂的,除非你親自經歷過,所以我不允許自己

相信任何人,只相信自己,任何人都不能阻擋我,包括我自己。而大部分時刻阻擋你的往往是你自己,如果你自己都不能阻擋你,則世無有所懼也!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

大學大學,大部分靠自學,如果只學大綱的東西畢業後。那就是廢物一條;

用此文開始我學Android的過程!

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

學習android開發首先要的java基礎是一定要有的!

<span style="font-size:18px;"><span style="font-size:14px;">//      關於求1-n之間的素數用java實現的幾種方法
//1.常規方法  從2--x-1是否可以被整除  


package text;
       import java.util.Scanner;
public class test {
	public static void main(String[] args) {
             Scanner in = new Scanner(System.in);
             int x;
             x = in.nextInt();
             boolean isprime = true;
             
             for (int i = 2; i <= x; i++) {
            	 for(int j = 2; j < i; j++) {
            		   if(i % j == 0)            {
            			 isprime = false;
                         break;
            		   }
            	 }
            	 if(isprime)      System.out.print(i + " ");
            	 isprime = true;
             }
             
//  測試結果:           100
//                  2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97        
//                
     }
}</span>

</span>










---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<span style="font-size:18px;">//      關於求1-n之間的素數用java實現的幾種方法
//2.改進方法  ①去偶數 ②從3開始每次加2是否可以被整除 則大約一共計算n/2次  


package text;
       import java.util.Scanner;
public class test {
	public static void main(String[] args) {
             Scanner in = new Scanner(System.in);
             int x;
             x = in.nextInt();
             boolean isprime = true;
            
             for(int i = 1; i <= x; i++ ) {
            	 if(i == 1 || (i % 2 == 0 && i != 2 ) )  continue;     //1和偶數便可以不必再往下走
            	 for(int j = 3; j < i; j += 2) {
            		 if(i % j == 0) {                                  //如果是2則不進入子迴圈
            			 isprime = false;    
                         break;           		
            		 }
            	 }
            	 if(isprime)    System.out.print(i + " ");
            	 isprime = true;
             }
             
         
//  測試結果:           100
//                  2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97        
//             
             
    }
}
             </span>
          
     


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<span style="font-size:18px;">//      關於求1-n之間的素數用java實現的幾種方法
//3.改進方法    每個數只要除到sqrtx 即可


package text;
       import java.util.Scanner;
public class test {
	public static void main(String[] args) {
             Scanner in = new Scanner(System.in);
             int x;
             x = in.nextInt();
             boolean isprime = true;
             
             for(int i = 1;i <= x; i++)  {
            	 if(i == 1 || (i % 2 == 0 && i != 2))      continue;
            	 for(int j = 3;j <= Math.sqrt(i);j += 2 ) {
            		 if(i % j == 0) {
            			 isprime = false;
            			 break;
            		 }
            	 }
            	 if(isprime)    System.out.print(i + " ");
            	 isprime = true;
             }
         
         
//  測試結果:           100
//                  2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97        
//             
                  
	  }
   }</span>

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<span style="font-size:18px;">//      關於求1-n之間的素數用java實現的幾種方法
//4.改進方法  判斷是否可以被<x的素數整除  


package text;
       import java.util.Scanner;
public class test {
	public static void main(String[] args) {
             Scanner in = new Scanner(System.in);
             int x;
             x = in.nextInt();
             int[]  prime = new int[100];
             int cnt = 1;
             prime[0] = 2;
             boolean isprime = true;
             
             for(int i = 3; i <= x; i += 2) {
            	 for(int j = 0; j < cnt; j++) {
            		 if(i % prime[j] == 0) {
            			 isprime = false;
            			 break;
            		 }
            	 }
            	 if(isprime)      prime[cnt++] = i;
            	 isprime = true;
             }
             
             for(int k = 0; k < cnt; k++) {
            	 System.out.print(prime[k] + " ");
             }
         
     
//  測試結果:           100
//                  2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97        
//             
                  
	  }
   }
</span>

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

5. 構造素數序列primes[i]: 2, 3, 5, 7, ...

由4的演算法我們知道, 在素數序列已經被構造的情況下, 判斷n是否為素數效率很高;

但是, 在構造素數序列本身的時候, 是否也可是達到最好的效率呢?

事實上這是可以的! -- 我們在構造的時候完全可以利用已經被構造的素數序列!

假設我們已經我素數序列: p1, p2, .. pn

現在要判斷pn+1是否是素數, 則需要(1, sqrt(pn+1)]範圍內的所有素數序列,

而這個素數序列顯然已經作為p1, p2, .. pn的一個子集被包含了!

//      關於求1-n之間的素數用java實現的幾種方法
//4.改進方法  構造素數表的方法

<span style="font-size:18px;">package text;
import java.util.Scanner;
public class test {
	public static void main(String[] args) {
             boolean[] isprime = new boolean[100];
             for(int i = 0;i < isprime.length; i++)
            	 isprime[i] = true;
             
             for(int i = 2; i < isprime.length;i++) {
            	 if(isprime[i]){
            		 for(int k = 2; i * k < isprime.length;k++){
            			isprime[i * k] = false; 
            		 }
            	 }
             }
             
             for(int i = 2; i < isprime.length; i++)
            	 if(isprime[i])   System.out.print(i + " ");
             
             
             
//  測試結果:           100
//                  2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97        
//             
                  
	  }
   }
</span>



最後自己總結一下;如果用陣列做的話構造素數表的方法,個人覺得並不可取,因為假如要求的是1-x的素數而x很大,,那麼必然要使用一個超大的陣列而素數只是佔其中一小部分,所以浪費了很多的空間;

2.建議採用第三種和第四種方法來做