[英]BufferedWriter problem
我制作了一个可以生成素数的程序。 我希望程序写入文件。 当我生成高达 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;
}
}
我认为您的程序根本没有挂起,只是需要很长时间才能完成工作。
随着数字变大,检查它们所花费的时间与它们的平方根成正比。 此外,素数之间的距离越大,数字越大。 将这些放在一起,发现素数的速度将很快下降。
您是否已将调试器附加到您的程序,并暂停执行以检查局部变量并查看它的位置? 你有没有输入System.out.println("About to calculate for " + i);
? 你怎么知道你的程序“刚刚停止”?
第一步应该是调查你的程序实际在做什么。 如果您使用 println 消息为 output 时间戳记,您还可以了解检查每个单独数字的速度如何衰减,因此当您发现暂停时,您可以粗略估计当前检查应该花费多长时间。
此外,你的程序永远不会终止,因为你有一个无限的外循环。 您for
循环的终止条件是i <= Integer.MAX_VALUE
,这意味着它会一直运行,直到找到i
i > Integer.MAX_VALUE
。 你能为i
命名一个值吗?
我已经登录到 bugs 数据库,它已被接受为一个新的 bug,它应该会在几天后出现在Bugs 数据库中。
在我看来,这就像 JIT 编译器中的错误。 它检测到 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 Main
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.