第 10001 个质数是多少?为什么我的 Java 解决方案给出错误 ArrayIndexOutOfBoundsException?

What is the 10001st prime number? Why does my Java solution give the error ArrayIndexOutOfBoundsException?

所以这是我的 Java Project Euler #7 代码(代码中注释掉的问题描述):

   // By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
   // What is the 10001st prime number?
    boolean isPrime = true;
    long [] primes = new long[10001];
    int j = 0;
    while (j < 10001){
        for (long i = 2; i < 1000000000000000L; i++) {
            for (long k = i; k < i / 2; k++) {
                if (i % k == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                primes[j] = i;
                j++;
            }
        }
    }
    System.out.println(primes[10000]);

当我 运行 这段代码时,这就是我得到的结果:

线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:10001

*at vasila.mir.Main.main(Main.java from InputFileObject:22)*

当我按下 ArrayIndexOutOfBoundsException 错误时,它给我这个“找出为什么 'j' 可能是 10001”。当我按下它时,这就是我得到的:

素数[j] = i;在 Main.main(String[])(过滤器:10001)

我不明白那是什么意思,它对我没有真正的帮助。 我的代码可能有什么问题?

如果您的 for (long i = 2; i < 1000000000000000L; i++) 找到的素数超过 10001 个,您的外循环条件将永远不会及时检查以完成程序。

你应该合并循环

改变

while (j < 10001){
    for (long i = 2; i < 1000000000000000L; i++) {

for (long i = 2; i < 1000000000000000L && j < 10001; i++) {

您还应该在外部 for 循环的开头将 isPrime 重置为 true。 并且在内部循环中,k 应该从 2 开始,而不是 i.

以下作品:

long [] primes = new long[10001];
int j = 0;
for (long i = 2; i < 1000000000000000L && j < 10001; i++) {
    boolean isPrime = true;
    for (long k = 2; k <= i / 2; k++) {
        if (i % k == 0) {
            isPrime = false;
            break;
        }
    }
    if (isPrime) {
        primes[j] = i;
        j++;
    }

}
System.out.println(primes[10000]);

输出:

104743