时间限制超过http://www.spoj.com/problems/PRIME1/,有人可以给我一些改进的提示吗?

时间:2014-07-26 13:54:04

标签: java

超过http://www.spoj.com/problems/PRIME1/的时间限制,有人可以给我一些提示吗? 嗨,我也在这里发布我的代码,请看看并给出一些建议,以避免超时。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.BitSet;

public class PrimeGenerator{
private static final int n=31624;
private static BitSet p=new BitSet(n);
private static BufferedReader getBufferedReader(){return new    BufferedReader(getInputStreamReader());}
private static InputStreamReader getInputStreamReader(){return new InputStreamReader(System.in);}
private static String getStringFromBR(BufferedReader bufferedReader) throws Exception{return bufferedReader.readLine();}
private static String[] splitString(String s){return s.split(" ");}
private static int getInteger(String s){return Integer.parseInt(s);}

public static void main(String args[]) throws Exception {
    findAllPrimes();
    BufferedReader br = getBufferedReader();
    String line = getStringFromBR(br);
    int t = getInteger(line);
    iterateForAllTestCases(br, t);
}

private static void iterateForAllTestCases(BufferedReader br, int t) throws Exception {

    for (int i=0; i<t; i++){
        String line=getStringFromBR(br);
        String a[]=splitString(line);
        long x=getInteger(a[0]);
        long y=getInteger(a[1]);
        printAllPrimes(x,y);
    }
}

private static void printAllPrimes(long x, long y){


        printAllPrimesUtil(x,y);


}

private static void printAllPrimesUtil(long x, long y){

    long i=x;
    long j;
    int flag;

    for( ;i<=y;i++){

        if(i<n){
            if(p.get((int) i)){
                System.out.println(i);
            }
        }

        else{
            flag=0;
            innerLoop:
            for(j=2; (j*j)<i; j++){
                if (flag==1) break innerLoop;

                if(p.get((int) j)){
                    if(i%j==0){
                        flag=1;
                    }

                }
            }

            if(flag==0){
                System.out.println(i);
            }
        }
    }
}


private static void findAllPrimes(){
    p.clear(0);
    p.clear(1);

    for (int i = 2; i <= n; i++){
        p.set(i);
    }

    for(int i=2; (i*i)<=n ;i++){
        if (p.get(i)) {
            for (int j = 2*i; j <= n; j+=i) {
                p.clear(j);
            }
        }
    }

}

}

1 个答案:

答案 0 :(得分:0)

之前我已经解决了这个问题,我在这里看到了你的想法,这似乎在正确的轨道上。为了解决TLE问题,我建议:

  1. 首先,在findAllPrimes()的第二个循环中,不应该将循环条件设为i <= n而不是(i*i) <= n?基本上你的程序认为[sqrt(31624), 31624)中的所有整数都是素数......

  2. 其次,尝试使用boolean[]int[]这样的原始数组而不是BitSet

  3. 一旦开始使用原始数组,使用int[]存储第i个素数,而不是使用boolean[]来存储如果我是素数< / strong>即可。这可以减少数组的长度,并且您不需要在循环的每个循环中计算j*j

  4. 希望他们能够工作,如果它仍然受到TLE的影响,请告诉我。