如何在java中优化Prime数字生成器?

时间:2016-03-06 09:47:22

标签: java optimization java-7

我在SPOJ上做了一些问题,它被称为素数生成器。

我的代码在我的本地计算机上工作正常但在SPOJ上我遇到超出时间限制的错误。

有人可以告诉我如何使这个程序和类似的程序更有效地运行大量嵌套循环?

  import java.util.*;
  import java.lang.*;
  import java.math.*;

  class Main {
     public static void main (String[] args) throws java.lang.Exception {
        Scanner obj = new Scanner(System.in);
        int t = obj.nextInt();

        for(int i = 0; i < t; i++) {
           int m = obj.nextInt();
           int n = obj.nextInt();

           for(int x = m; x <= n; x++) {
              boolean flag = true;
              int count = 0;
              for(int j = 2; j < Math.pow(n,0.5) ; j++) {
                 if(x == 1 || x == 2) {
                    flag = false;
                    break;
                 }
                 if(x % j == 0 && x != j) {
                    flag = false;
                    break;
              }
           }
           if(flag) {
              System.out.println(x);
           }
        }
        System.out.println();
     }
  }

2 个答案:

答案 0 :(得分:1)

  • 每次在循环中调用Math.pow(n,0.5)都应该很慢,所以应该在每次循环之前调用一次,并且应该保存返回值。
  • 您只需将值除以等于或小于sqrt(n)素数
  • 使用像Eratosthenes筛子这样的东西。不是单独判断每个数字,而是从数字列表中删除多个素数。

答案 1 :(得分:0)

这是一个非常快的简单示例(代码已完成,因此您可以自行测试)。

它通过忽略所有偶数来减少所涉及的循环次数,并通过除以目前为止发现的其他素数来测试数字是否为素数

import java.util.List;
import java.util.ArrayList;

public class PrimeGen
{
    public static void main( String[] args )
    {
        // Max number to search to (hardcoded for example).
        int max = 100;

        // List of primes discovered so far.
        // We'll start it off as [2].
        // We testing if a number is prime we just have to test if it's
        // divisible by the other primes we have discovered so far.
        List<Integer> primes = new ArrayList<Integer>();
        primes.add(2);

        // Test all odd numbers up to max (evens are not prime).
        for( int i = 3; i < max; i = i + 2 )
        {
            boolean isPrime = true;

            for( int j : primes )
            {
                if( i % j == 0 )
                    isPrime = false;
                    break;
            }

            if( isPrime )
            {
                primes.add( i );
            }
        }

        // Print results.
        for( Integer i : primes )
        {
            System.out.print( i + ", " );
        }
    }
}