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

问题描述

这是我为 Project Euler #7 编写的 Java 代码代码中注释掉的问题描述):

   // 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]);

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

线程“main”中的异常 java.lang.Arrayindexoutofboundsexception: 10001

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

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

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

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

解决方法

如果您的 file 找到超过 10001 个素数,则永远不会及时检查您的外循环条件以完成程序。

你应该组合循环

改变

finfo

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY,name VARCHAR(12) UNIQUE
);


DELIMITER $$

CREATE OR REPLACE PROCEDURE array_insert(my_array VARCHAR(50))
BEGIN
    
    DECLARE counter INT DEFAULT 1;

    WHILE counter <= CHAR_LENGTH(my_array)-CHAR_LENGTH(REPLACE(my_array,',''))+1 DO
        INSERT INTO my_table (name) VALUES (SUBSTRING_INDEX(SUBSTRING_INDEX(my_array,counter),-1));
        SET counter = counter + 1;
    END WHILE;

END$$

DELIMITER ;

CALL array_insert('billy,bob,jane');

SELECT * FROM my_table;
+----+-------+
| id | name  |
+----+-------+
|  1 | billy |
|  2 | bob   |
|  3 | jane  |

您还应该在外部 for 循环开始时将 for (long i = 2; i < 1000000000000000L; i++) 重置为 while (j < 10001){ for (long i = 2; i < 1000000000000000L; i++) { 。 在内部循环中,for (long i = 2; i < 1000000000000000L && j < 10001; i++) { 应该从 isPrime 开始,而不是 true

以下工作:

k

输出:

2