首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedWriter问题

BufferedWriter问题
EN

Stack Overflow用户
提问于 2011-05-27 23:52:31
回答 2查看 704关注 0票数 1

我做了一个可以生成素数的程序。我想让程序写入文件。当我生成Integer.Max_Value之前的素数时,由于某种原因,它不会写出所有的素数,它就会停止。下面是我的代码:

代码语言:javascript
复制
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;
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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命名一个值吗?

票数 5
EN

Stack Overflow用户

发布于 2011-05-28 00:18:36

我已经登录到bugs数据库,它已经被接受为一个新的bug,应该在几天后出现在Bugs Database中。

在我看来,这像是JIT编译器中的一个bug。它检测到i <= limit始终为真(对于Integer.MAX_VALUE -1不会发生这种情况),并生成不正确的代码。如果您运行以下命令。

代码语言:javascript
复制
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;
}

它打印出来

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6154722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档