我做了一个可以生成素数的程序。我想让程序写入文件。当我生成Integer.Max_Value之前的素数时,由于某种原因,它不会写出所有的素数,它就会停止。下面是我的代码:
import java.io.*;
public class Primes {
public static void main(String[] args) throws IOException {
generate(Integer.MAX_VALUE);
}
// generate primes.
public static void generate(int limit) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Primes.txt"));
writer.write(2);
for (int i = 3; i <= limit; i += 2) {
if (isPrime(i)) {
writer.write(Integer.toString(i));
writer.newLine();
}
}
writer.close();
}
// checking for primes
public static boolean isPrime(int n) {
for (int i = 2; i <= (Math.sqrt(n)); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}发布于 2011-05-28 00:17:46
我认为你的程序根本没有挂起,它只是花了很长时间来完成它的工作。
随着数字变得越来越大,检查它们所需的时间与它们的平方根成比例增加。另外,质数之间的距离越大,数字越大。把这些放在一起,找到素数的速度会很快下降。
您是否将调试器附加到您的程序中,并暂停执行以检查局部变量并查看它到达的位置?你放进System.out.println("About to calculate for " + i);了吗?你怎么知道你的程序“就这么停了”?
第一步应该是对你的程序实际在做什么进行一些调查。如果您输出带有println消息的时间戳,您还可以了解检查每个单独数字的速度如何衰减,因此,当您发现暂停时,您可以粗略估计当前检查应该花费多长时间。
此外,你的程序永远不会终止,因为你有一个无限的外部循环。您的for循环的终止条件是i <= Integer.MAX_VALUE,这意味着它将一直运行,直到找到一个i,即i > Integer.MAX_VALUE。你能为i命名一个值吗?
发布于 2011-05-28 00:18:36
我已经登录到bugs数据库,它已经被接受为一个新的bug,应该在几天后出现在Bugs Database中。
在我看来,这像是JIT编译器中的一个bug。它检测到i <= limit始终为真(对于Integer.MAX_VALUE -1不会发生这种情况),并生成不正确的代码。如果您运行以下命令。
public static void main(String[] args) {
for(int i=0;i<10;i++)
generate(Integer.MAX_VALUE);
for(int i=0;i<10;i++)
generate2(Integer.MAX_VALUE);
System.out.println("End of Main");
}
// generate primes.
public static void generate(int limit) {
int lastPrime = 0;
for (int i = 3; i <= limit; i += 2)
if (isPrime(i))
lastPrime = i;
System.out.println("1: Stopped generating at lastPrime= "+lastPrime);
}
public static void generate2(int limit){
int lastPrime = 0;
for (int i = 3; i <= limit; i += 2)
if (isPrime(i))
lastPrime = i;
System.out.println("2: Stopped generating at lastPrime= "+lastPrime);
}
// checking for primes
public static boolean isPrime(int n) {
double sqrt = Math.sqrt(n);
for (int i = 2; i <= sqrt; i++)
if (n % i == 0)
return false;
return true;
}它打印出来
1: Stopped generating at lastPrime= 39367
1: Stopped generating at lastPrime= 55291
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
1: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 49603
2: Stopped generating at lastPrime= 2039
2: Stopped generating at lastPrime= 2039
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
2: Stopped generating at lastPrime= 3
End of Mainhttps://stackoverflow.com/questions/6154722
复制相似问题