超过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);
}
}
}
}
}
答案 0 :(得分:0)
之前我已经解决了这个问题,我在这里看到了你的想法,这似乎在正确的轨道上。为了解决TLE问题,我建议:
首先,在findAllPrimes()
的第二个循环中,不应该将循环条件设为i <= n
而不是(i*i) <= n
?基本上你的程序认为[sqrt(31624), 31624)
中的所有整数都是素数......
其次,尝试使用boolean[]
或int[]
这样的原始数组而不是BitSet
。
一旦开始使用原始数组,使用int[]
存储第i个素数,而不是使用boolean[]
来存储如果我是素数< / strong>即可。这可以减少数组的长度,并且您不需要在循环的每个循环中计算j*j
。
希望他们能够工作,如果它仍然受到TLE的影响,请告诉我。