我一直在研究Project Euler问题,即找到第10001个素数。我用java制作了这个项目,它给了我正确的答案。我忍不住注意到它花了17秒才找到答案。我对java很新,我很感激有关如何提高Java程序效率的反馈 - 目前它是强力的。
static boolean isPrime;
static int primeCount;
static int forI = 1;
static int latestPrime;
public static void main(String[] args){
long startTime = System.currentTimeMillis();
while(primeCount < 10001){
isPrime = true;
forI++;
for(int i = forI - 1; i > 1; i--){
//If forI is divisible by another number < forI, it is not prime
if(forI % i == 0){
isPrime = false;
}
}
if(isPrime){
primeCount++;
latestPrime = forI;
}
}
long endTime = System.currentTimeMillis() - startTime;
System.out.println(primeCount+" "+latestPrime);
System.out.println("Time taken: " + endTime / 1000 + " seconds");
}
答案 0 :(得分:1)
您需要查看Sieve of Eratosthenes。
基本上,对于每个数字,你通过检查每个数字是否小于它的均值来检查它是否是素数,这是非常低效的。
为了便于改进,您只需要检查小于该数字的平方根的所有除数。
答案 1 :(得分:0)
import java.util.Scanner;
public class NewNthPrime{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
boolean flag = false;
int max = 10002;
int[] a = new int[max];
a[0] = 2;
int i = 3,j=0;
int t = in.nextInt();
for(int a0 = 0; a0 < t; a0++){
int n = in.nextInt();
while(j<n){
for(int y=0;y<a.length;y++){
if(a[y]==0){
break;
}
else if (i%a[y]==0){
flag = true;
break;
}
}
if(!flag){
a[++j]=i;
}
flag =false;
i+=2;
}
System.out.println(a[n-1]);
}
}
}