я наткнулся на следующий вопрос на веб-сайте программирования: Питер хочет сгенерировать несколько простых чисел для своей криптосистемы. Помоги ему! Ваша задача состоит в том, чтобы сгенерировать все простые числа между двумя заданными числами!
Ввод
Ввод начинается с количества 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.
Спасибо, Рохит