Программа для поиска всех простых чисел в очень большом заданном диапазоне целых чисел

я наткнулся на следующий вопрос на веб-сайте программирования: Питер хочет сгенерировать несколько простых чисел для своей криптосистемы. Помоги ему! Ваша задача состоит в том, чтобы сгенерировать все простые числа между двумя заданными числами!

Ввод

Ввод начинается с количества t тестов в одной строке (t<=10). В каждой из следующих t строк через пробел записаны два числа m и n (1 <= m <= n <= 1000000000, n-m<=100000).

Я нашел следующее решение:

import java.util.*;

public class PRIME1 {
    static int numCases;
    static int left, right;
    static boolean[] initSieve = new boolean[32000];
    static boolean[] answer;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        numCases = sc.nextInt();
        initSieve[0] = true;
        initSieve[1] = true;
        Sieve();
        for (int j = 0; j < numCases; j++) {
            String line = sc.next();
            String line2 = sc.next();
            left = Integer.parseInt(line);
            right = Integer.parseInt(line2);
            answer = new boolean[right - left + 1];
            getAnswer();
            for (int i = 0; i < answer.length; i++) {
                if (!answer[i]) {
                    int ans = i + left;
                    System.out.println(ans);
                }
            }
            System.out.println();
        }
    }

    public static void Sieve() {

        for (int i = 2; i < 32000; i++) {
            if (!initSieve[i]) {
                for (int j = 2 * i; j < 32000; j += i) {
                    initSieve[j] = true;
                }
            }
            if (i * i > 32000)
                break;
        }
    }

    public static void getAnswer() {
        for (int i = 2; i < 32000 && i <= right; i++) {
            if (!initSieve[i]) {
                int num = i;
                if (num * 2 >= left) {
                    num *= 2;
                } else {
                    num = (num * (left / num));
                    if (num < left)
                        num += i;
                }
                for (int j = num; j >= left && j <= right; j += i) {
                    answer[j - left] = true;
                }
            }
        }
    }
}

Я отредактировал свое решение после прочтения некоторых предложений. Я все еще получаю сообщение о превышении лимита времени. Любые еще предложения о том, как еще больше оптимизировать это? Я вычисляю все простые числа до 32000, а затем использую их, чтобы найти простые числа от n до m.

Спасибо, Рохит

5
задан Robert 23 May 2012 в 00:11
поделиться