EpicKai Ответов: 3

Повышение скорости работы кода


Мой код успешно подсчитывает количество простых чисел перед заданным числом n. однако мне нужен способ повысить его скорость, поскольку он не эффективен для чрезвычайно больших чисел.

Что я уже пробовал:

public class Solution {
    public static int countPrimes(int n) {
        int count = 0;
        for(int i = 2; i < n; i++){
            if(IsPrime( i )){
                count++;
            }
        }
        return count;
    }
    public static boolean IsPrime(int num) {
        for(int i=2;i<=num/2;i++){
            if(num % i == 0){
                return false;
            }
        }
        return true
}

CPallini

Нет никакого способа улучшить скорость Java. Попробуйте использовать реальный язык программирования...
(просто шучу)

3 Ответов

Рейтинг:
2

Andy Allinger

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

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

Тривиально, чтобы улучшить функцию IsPrime, которую вы здесь дали, верхняя граница for цикл должен быть i <= ceiling(sqrt (num)), потому что не простое число должно иметь два фактора, и один из них должен быть меньше или равен его квадратному корню. Кроме того, деление на два должно происходить перед циклом, так что тогда цикл может выполняться:
for (i=3; i<=ceiling(sqrt(num)); i=i+2) { ...}
Таким образом, вам нужно только проверить нечетные делители. В два раза быстрее.


CPallini

5.

Рейтинг:
1

Dave Kreskowiak

Существует несколько способов создания списка простых чисел. Методы, которые намного быстрее, чем наивный метод, который вы используете сейчас. Я призываю вас поискать в Google генераторы простых чисел, такие как сито Эратосфена. Вам не нужно генерировать список простых чисел, который останавливается именно на том пределе, который вы хотите. Вы можете сгенерировать список большего размера, а затем считать только до нужного вам числа.


CPallini

5.

Рейтинг:
0

Patrice T

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


CPallini

5.

Patrice T

Спасибо