Java 寻找10001:st素数(Euler项目)

Java 寻找10001:st素数(Euler项目),java,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)

我正在做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));

}
inti=2//检查素数是否为的数字
int c=0//质数的数量
while(true){
//检查i%n==0,如果是,则i不是质数。

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

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

一个建议是,尽量避免这些(正确)。你可以做如下事情:

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

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

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

通过搜索,您可以发现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));

}
publicstaticvoidmain(字符串…参数){
int i=2;//检查素数是否为的数字
int c=1;//到目前为止已找到素数计数器
while(true){
如果(i){
C++;
}
//如果c==10001,我们找到了10001:st素数
如果(c==10001){
系统输出打印LN(i);
打破
}
i++;
}
}
公共静态布尔值iPrime(整数){

对于(inti=2;i素数,需要注意的一点是,除了数字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;
        }
    }
}
公共类堆栈溢出{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//从1开始,因为我已经包括2
长素数=1;
//从奇数开始,因为素数从来都不是偶数
长素数=1;
日历开始=Calendar.getInstance();
而(素数<10001){
素数+=2;
if(isPrime(prime)){
primeCount++;
}
}
System.out.println(prime);
System.out.println(String.format(“运行时间:%d毫秒”,Calendar.getInstance().getTimeInMillis()-start.getTimeInMillis());
}
私有静态布尔iPrime(长素数){

如果(素数项目Euler更多的是关于数学而不是编程。蛮力几乎从来都不是Euler的答案。@Boristespider好的,我明白了。但是我该如何找到这个问题的数学解决方案?这通常是涉及编程的问题通过数字测试来解决的吗?素数通常是使用。不确定你告诉我什么a由第二部分开始。谢谢!它没有立即起作用,但当我像你说的那样切换顺序并在开始时设置c=1时,它起作用了。我不明白为什么在找到素数之前c!=0。对于I=2,检查I是否为素数的For循环是空的,因此2不能被识别为素数。这不应该起作用对于3,也是如此,因此在开始时,偶数c应设置为2。