Java 求第10001素数

Java 求第10001素数,java,Java,我正在进行Euler#7项目,我编码: public class Seven { public static void main(String[] args) { int i = 0; int c = 1; while (c <= 10001) { if (squareRootIsPrime(i)) { c++; } i+

我正在进行Euler#7项目,我编码:

public class Seven {

    public static void main(String[] args) {

        int i = 0;
        int c = 1;

        while (c <= 10001) {

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

            i++;

        }

        System.out.println(Math.sqrt(i));
    }

    public static boolean squareRootIsPrime (int n) {

        int x = 0;

        for (int d = 1; d <= n; d++) {
            if (n % d == 0) {x += 1;}
        }

        if (x == 3) {
            return true;
        } else {
            return false;
        }

    }

}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;

而(c第10001个素数的平方刚好小于110亿。一个int可以容纳的最大值刚好超过20亿。因此变量
i
在到达第10001个素数的平方之前很久就会溢出。因为那样的话,你永远看不到第10001个素数

理论上,如果您将变量
i
和参数
n
的类型更改为
long
,这将起作用。但是如果您这样做,您将得到需要计算大约60五百万次
%
操作的代码(即,6加19个零).除非你有一台速度惊人的电脑,否则这不会在你的有生之年结束


您可能需要考虑您可以使用哪些其他算法。

第10001个素数的平方略低于110亿。一个int所能容纳的最大值略高于20亿。因此变量
i
在到达第10001个素数的平方之前很久就会溢出。因为这样,您将永远看不到第10001个素数主要的

理论上,如果您将变量
i
和参数
n
的类型更改为
long
,这将起作用。但是如果您这样做,您将得到需要计算大约60五百万次
%
操作的代码(即,6加19个零).除非你有一台速度惊人的电脑,否则这不会在你的有生之年结束


您可能需要考虑可以使用哪些其他算法。

首先,您应该将
i++;
行移到
if(squareRootIsPrime(i))
上方,否则您将打印实际搜索结果后面的数字的平方根


没有打印结果的原因很简单,就是计算机计算时间太长。我正在测试
c首先,您应该将
I++;
行移到
if(squareRootIsPrime(I))
上方,否则您将打印实际搜索结果后面的数字的平方根


你没有打印出结果的原因很简单,就是计算机计算时间太长。我正在测试
c10001st素数仅为104743

您可以将代码更改为:

public class Seven {
public static void main(String[] args) {
    int i = 0;
    int c = 1;
    while (c <= 10001) {
    if (IsPrime(i)) {
            c++;
            System.out.println(i);
        }
        i++;
    }
    System.out.println(i);
}
public static boolean IsPrime(long x) {
    if (x<2) return false;
    if (x<=3) return true;
    for (long j = 2; j <= Math.sqrt(x) + 1; ++ j) 
    if (x % j == 0) return false;
    return true;
}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;

而(c10001素数仅为104743

您可以将代码更改为:

public class Seven {
public static void main(String[] args) {
    int i = 0;
    int c = 1;
    while (c <= 10001) {
    if (IsPrime(i)) {
            c++;
            System.out.println(i);
        }
        i++;
    }
    System.out.println(i);
}
public static boolean IsPrime(long x) {
    if (x<2) return false;
    if (x<=3) return true;
    for (long j = 2; j <= Math.sqrt(x) + 1; ++ j) 
    if (x % j == 0) return false;
    return true;
}
公共七级{
公共静态void main(字符串[]args){
int i=0;
int c=1;

虽然(c)即使将
10001
更改为
10
它调用此函数超过800次,也不确定Fibonacci与任何事情有何关系。此外,不需要BigInteger。被测试的数字不超过110亿,这很容易放在一个较长的范围内。@bastard24即使将
10001
更改为
10
它调用此函数ion超过800次不确定Fibonacci与任何事情都有什么关系。此外,不需要BigInteger。被测试的数字不超过110亿,这很容易放入一个长字符串中。@Bastard24是OP的代码,不检查a数字sqrt是否为素数。可以始终使用相同的算法,但将methods参数更改为n a增益-而不是n,我需要定义为int i=Math.sqrt(n)然后。我认为这是毫无意义的,正如我在回答中所描述的,这只是一个优化-但我明白你的意思。但是我会保持原样,因为我描述了我所做的更改。OP的代码是否没有检查a数字sqrt是否为素数?One可以始终使用相同的算法,但更改方法参数再次从er到n,而不是n,我需要定义为int i=Math.sqrt(n)。我认为这是毫无意义的,正如我在回答中所描述的,这只是一个优化,但我明白你的意思。不过我会保持原样,因为我描述了我所做的更改。