[Java]常规方法和筛法求解素数效率对比

xiaoxiao2021-02-28  107

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)时候,效率明显看出了不同。

转载请注明原文地址: https://www.6miu.com/read-50466.html

最新回复(0)