Задача программирования почти простых чисел не принята в Java
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) throws IOException {
Scanner s = new Scanner(System.in);
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String str = input.readLine();
StringTokenizer token = new StringTokenizer(str);
int casos = Integer.parseInt(token.nextToken());
for (int i = 1; i <= casos; i++) {
str = input.readLine();
token = new StringTokenizer(str);
long n1 = Long.parseLong(token.nextToken());
long n2 = Long.parseLong(token.nextToken());
int cant = (int) (n2 - n1);
Boolean[] bool = new Boolean[1000000];
ArrayList<Long> primos = new ArrayList<Long>();
ArrayList<Long> casiP = new ArrayList<Long>();
Arrays.fill(bool, Boolean.TRUE);
for (int j = 2; j < 1000000; j += 2) {
bool[j] = false;
}
primos.add(2L);
for (int p = 3; p <= 1000; p += 2) {
if (bool[p]) {
for (int j = p; j * p < 1000000; j++) {
bool[j * p] = false;
}
primos.add((long) p);
}
}
for (int j = 1001; j <= 1000000; j += 2) {
if (bool[j]) {
primos.add((long) j);
}
}
for (int j = 0; j < primos.size(); j++) {
long k = primos.get(j);
for (long a = k * k; a < 1000000000000L; a *= k) {
casiP.add(a);
}
}
int cont = 0;
for (int j = 0; j < casiP.size(); j++) {
if (casiP.get(j) >= n1 && casiP.get(j) <= n2) {
cont++;
}
}
System.out.println(cont);
}
}
}
Привет, я кодировал вышеупомянутое решение для проблемы UV39 10539, используя Сито Эратосфена, как и большинство людей, однако основное отличие состоит в том, что почти все используют C++ и "читы" с такими функциями, как memset, а я даже изменил сканер Scanner с BufferedReader и даже тогда мое решение использует менее 3 секунд. Повсеместно написано, что проблемы конкурентного программирования не зависят от языка программирования, поэтому я делаю что-то не так, есть ли способ улучшить мой код или просто некоторые проблемы не могут быть приняты при использовании Java?. Я очень ценю помощь.
1 ответ
До сих пор неясно, в чем именно проблема, но ваш код расточителен, потому что он пересчитывает сита для каждой введенной пары чисел. Вам необходимо рассчитать сита только один раз, прежде чем войти в самый внешний цикл for, а затем, внутри цикла, оставить только самый последний цикл for.