[Java]常規方法和篩法求解素數效率對比
阿新 • • 發佈:2019-01-28
package site.iknown.farm.test; public class Main { private static int isPrime(int n) { for(int i=2;i<=Math.sqrt(n);i++) { if(n%i == 0) { return 0; } } return 1; } private static int normalPrimes(int n) { int sum = 0; for(int i=2;i<n;i++) { sum += isPrime(i); } return sum; } private static int betterPrimes(int n) { int array[] = new int[n]; for(int i=2;i<array.length;i++) { array[i] = 1; } for(int i=2;i<array.length;i++) { if(array[i] == 1) { for(int j=2;i*j<array.length;j++) { array[i*j] = 0; } } } int sum = 0; for(int i=2;i<array.length;i++) { sum += array[i]; } return sum; } public static void main(String[] args) { for(int i=2;i<10;i++) { long normalStart = System.currentTimeMillis(); int sum = normalPrimes((int)Math.pow(10, i)); long normalEnd = System.currentTimeMillis(); System.out.println("素數統計結果:"+"0-"+Math.pow(10, i)); System.out.println("普通方法:"); System.out.print(sum+"個"); System.out.println((normalEnd - normalStart)+"毫秒"); long betterStart = System.currentTimeMillis(); int reSum = betterPrimes((int) Math.pow(10, i)); long betterEnd = System.currentTimeMillis(); System.out.println("篩法:"); System.out.println(reSum+"個"); System.out.println((betterEnd - betterStart)+"毫秒"); } } }
執行分析:
資料範圍比較小的時候兩種方法差不多,但是對於資料範圍比較大尤其是大於pow(10,5)時候,效率明顯看出了不同。