求一億以內的素數
阿新 • • 發佈:2019-01-06
晚上由於要幫老師算一個數學猜想,需要一個素數集合,於是寫了一個。
思路:如果一個數不能被所有比它小的素數整除,那麼它也是素數。
MAX就是素數的上限,計算一億以內的素數,總共用時171330毫秒,約為171秒。
import java.util.ArrayList; public class Test{ static ArrayList<Long> list = new ArrayList<Long>();//儲存素數 public static void main(String[] args){ long start = System.currentTimeMillis(); long MAX = 1_0000_0000;//一億 findPrime(MAX); long end = System.currentTimeMillis(); System.out.println("一共有" + list.size() + "個素數,用時" + (end - start)/1000.0 + "秒"); } //找出MAX以內的所有素數並存入list private static void findPrime(long MAX){ boolean flag = true; list.add(2L); for (long n = 3; n <= MAX; n++){ //檢測n是否素數。如果不能被比它小的所有素數整除,則為素數 flag = true; for(int i = 0; i < list.size(); i++){//get()方法引數必須是int if(list.get(i)*list.get(i) > n) break;//相當於常用素數演算法中的sqrt(n)為上限 if(n%list.get(i) == 0){ flag = false;//能被除盡則說明非素數 break; } } if(flag) list.add(n);//儲存素數 } } }
網上百度了一下,找到大神的演算法,只需要0.548秒
public class Prime2 { public static int calculateNumber(int Nmax) { boolean[] isPrime = new boolean[Nmax + 1]; int[] prime = new int[Nmax / 10]; int totalPrimes = 1; for (int i = 3; i <= Nmax; i += 2) isPrime[i] = true; isPrime[2] = true; prime[0] = 2; for (int i = 3; i <= Nmax; i += 2) { if (isPrime[i]) prime[totalPrimes++] = i; for (int j = 1; i * prime[j] <= Nmax && j < totalPrimes; j++){ isPrime[i * prime[j]] = false; if(i%prime[j]==0) break; } } return totalPrimes; } public static void main(String[] args) { final int Nmax = 100000000; double startTime = System.currentTimeMillis(); int primeNum = Prime2.calculateNumber(Nmax); double timeSpent = (System.currentTimeMillis() - startTime) / 1000; System.out.println("The prime numbers from 1 to " + Nmax + " is " + primeNum); System.out.println("Time spent : " + timeSpent + " s"); } }