プログラミング Web サイトで、次の質問に出くわしました。Peter は、彼の暗号システム用にいくつかの素数を生成したいと考えています。彼を助けて!あなたの仕事は、与えられた 2 つの数の間のすべての素数を生成することです!
入力
入力は、1 行のテスト ケースの数 t で始まります (t<=10)。次の t 行のそれぞれには、スペースで区切られた 2 つの数値 m と n (1 <= m <= n <= 1000000000、nm<=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 までの素数を見つけます。
ありがとう、ロヒット