改善第10001个素数项目

时间:2014-03-07 20:02:52

标签: java primes

我一直在研究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");  
}  

2 个答案:

答案 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]);
        }
    }
}