1. 程式人生 > >[Java]常規方法和篩法求解素數效率對比

[Java]常規方法和篩法求解素數效率對比

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