Эта часть очень innefficent: -
for(i=1;i<=primeNum;i++){
if((primeNum%i)==0) {
factors++; // total number of factors
}
}
Подсчитывает общее количество факторов. Поскольку все, что вас интересует, - это число, простое или нет, количество факторов не требуется. Тест должен быть, если есть фактор, который не является 1 или проверенным числом. Таким образом, вы можете это сделать: -
boolean is_prime = true;
// start at 3 as 1 is always a factor and even numbers above 2 are definately not prime, terminate at n-1 as n is also a factor
for(i=3;i<primeNum;i+=2){
if((primeNum%i)==0) {
is_prime = false;
break;
}
}
Это теперь более эффективно для не простых чисел. Для простых чисел это слишком много, факторы попадают в пары: если a.b == c, то a < = sqrt (c) и b> = sqrt (c), поэтому цикл может безопасно завершаться в sqrt (primeNum). Вы можете вычислить sqrt (primeNum) перед циклом, но для этого обычно требуется использование функций с плавающей запятой. Вместо этого или заканчивая при i> sqrt (primeNum), завершите цикл, когда i.i> primeNum. Вы также можете удалить умножение i.i и заменить его дополнительной переменной и несколькими добавками (слева в качестве упражнения для читателя).
Другим подходом является использование сита, как упомянуто другими, что является простым методом, когда существует фиксированный верхний предел для пространства поиска. Вы можете сделать версию, которая не имеет верхнего предела (размер памяти не выдерживает), но довольно сложно реализовать, поскольку для этого требуется немного динамического управления памятью. Не уверен, что простое сито будет быстрее, чем поиск факторов, поскольку вы будете бить память с помощью сита, который имеет большое влияние на скорость.
Ваш алгоритм неэффективен. – Rupak
Потому что вы используете цикл в 2 миллиона раз. – Makky
По-прежнему не должно занимать 30 минут. Я подозреваю бесконечный цикл – sanbhat