Проблема BufferedWriter - PullRequest
       18

Проблема BufferedWriter

1 голос
/ 27 мая 2011

Я сделал программу, которая может генерировать простые числа. Я хочу, чтобы программа записала в файл. Когда я генерирую простые числа до 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;
}
}

Ответы [ 2 ]

5 голосов
/ 27 мая 2011

Я думаю, что ваша программа вообще не зависает, просто требуется много времени, чтобы выполнить свою работу.

По мере увеличения чисел количество времени, необходимое для их проверки, увеличивается пропорционально ихквадратный корень.Кроме того, расстояния между простыми числами тем больше, чем больше число.Соединив их вместе, скорость, с которой будут найдены простые числа, довольно быстро иссякнет.

Вы подключили отладчик к своей программе и приостановили выполнение, чтобы проверить локальные переменные и посмотреть, где они находятся?Вы даже вставили System.out.println("About to calculate for " + i);?Откуда вы знаете, что ваша программа «просто останавливается»?

Первым шагом должно быть некоторое исследование того, что на самом деле делает ваша программа.Если вы выводите временные метки с помощью сообщений println, вы также можете получить представление о том, как уменьшается скорость проверки каждого отдельного числа, и, таким образом, когда вы определяете паузу, вы можете получить приблизительную оценку того, сколько времени займет текущая проверка.*


Кроме того, ваша программа никогда не завершится, поскольку у вас есть бесконечный внешний цикл.Условием завершения цикла for является i <= Integer.MAX_VALUE, что означает, что он будет работать до тех пор, пока не найдет i такой, что i > Integer.MAX_VALUE.Можете ли вы назвать значение для i, где оно будет иметь значение true?

2 голосов
/ 27 мая 2011

Я зарегистрировался в базе данных ошибок, и она была принята как новая ошибка, которая должна появиться в базе данных Ошибки через несколько дней.


Это выглядит мнекак ошибка в компиляторе JIT.Он обнаруживает, что i <= limit всегда истинно (этого не происходит для Integer.MAX_VALUE -1), и выдает неверный код.Если вы запустите следующее. </p>

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
...