问题描述
这是我为 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