關於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.建議採用第三種和第四種方法來做