找到10001:st素数(Euler项目)

时间:2015-04-12 15:15:10

标签: java

我正在对Euler项目进行挑战7,这需要我找到10001:st素数。

我的尝试如下:

    int i=2; //the number to check if prime
    int c=0; //the amount of prime numbers

    while(true){

        //checks if i%n == 0, if so, i is not a prime number. 
        for(int n=2;n<=prob.getMax(i);n++){
            //it is not a prime number
            if(i%n==0){
                break;
            }

            //it is a prime number 
            if(n==prob.getMax(i)){
                c++;
                break;
            }

        }
        i++;

        //if c == 10001 we have found the 10001:st prime number
        if(c==10001){
            System.out.println(i);
            break;
        }

    }

}

public int getMax(int x){

    return (int) Math.ceil(Math.sqrt(x));

}

我返回值104760,但这似乎不正确。我无法理解我做错了什么,因为我似乎得到了合理的价值。有人能指出我正确的方向吗?

还有:有没有更好的方法来计算这类问题?我似乎正在使用for-loop和暴力强迫我解决每个问题的解决方案。

5 个答案:

答案 0 :(得分:2)

在检查找到的素数是否是第10001个之前增加i。通过交换这些操作的顺序,它应该可以工作。

答案 1 :(得分:0)

在显示结果之前,您正在增加i(使用i++)。 100001素数可能是104760-1。

一个建议,尽量避免这些(真实)。你可以这样做:

c = 0;
while (c < 10001) {
    ....
    c++
}

答案 2 :(得分:0)

在您的代码中,您没有检查for循环中的prob.getMax(i)。 在for循环的正文中添加另一个检查,如下所示:

if(n==theDesiredNumber){
 //...
 break;
}

答案 3 :(得分:0)

通过搜索,您可以发现第10001个素数是104743。 我将你的算法改为:

public static void main(String... args) {
  int i = 2; //the number to check if prime
  int c = 1; //the counter for prime numbers have found so far

    while (true) {

       if(isPrime(i)){
           c++;
       }

        //if c == 10001 we have found the 10001:st prime number
        if (c == 10001) {
            System.out.println(i);
            break;
        }
        i++;

    }

}

public static boolean isPrime(int number) {
    for (int i = 2; i <= getMax(number); i++) {
        if (number % i == 0)
            return false;
    }
    return true;
}

public static int getMax(int x) {

    return (int) Math.ceil(Math.sqrt(x));

}

答案 4 :(得分:0)

素数的一个注意事项是,除了数字2之外,它们总是奇数,你不必检查数字是否可以被它前面的每个数字整除。

public class StackOverflow {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Starting at 1 cause I'm already including 2
        long primeCount = 1; 

        // Start with an odd number cause primes are never even
        long prime = 1;

        Calendar start = Calendar.getInstance();
        while (primeCount < 10001) {
            prime += 2;
            if (isPrime(prime)) {
                primeCount++;
            }
        }

        System.out.println(prime);
        System.out.println(String.format("Elapsed Time: %d ms", Calendar.getInstance().getTimeInMillis() - start.getTimeInMillis()));
    }

    private static boolean isPrime(long prime) {
        if (prime <= 1)
            return false;
        else if (prime % 2 == 0)
            return (prime == 2);
        else
        {
            int divisor = 3;
            double upperLimit = Math.sqrt((double)prime) + 1;

            while (divisor <= upperLimit)
            {
                if (prime % divisor == 0)
                    return false;

                // Skip by two cause an odd number is never evenly divisible by an even number
                divisor +=2;
            }
            return true;
        }
    }
}

结果(!!!! SPOILER ALERT !!!!!)

enter image description here