繁体   English   中英

BufferedWriter 问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM