У меня есть следующий запрос:Расчет простых множителей числа
найти простые множители (без их показателей) для заданного числа
n
с2 < n < 999999
.
У меня есть the following algorithm, который решает эту проблему, но, кажется, есть некоторые проблемы с производительностью:
bool is_prime(const unsigned long int &number) {
for (unsigned long int i = 2; i <= sqrt(number); i++) {
if (number%i == 0) return false;
}
return true;
}
unsigned long int next_prime(unsigned long int current) {
current++;
while (!is_prime(current)) {
current++;
}
return current;
}
// THE PROBLEM SOLVER
vector<unsigned long int> find_divisors(const unsigned long int &n) {
vector<unsigned long int> divisors;
for (unsigned long int i = 2; i <= n; i = next_prime(i)) {
if (n%i == 0) divisors.push_back(i);
}
return divisors;
}
Выпуск: для больших чисел, алгоритм занимает слишком много времени (для максимального допустимого числа, требуется около 1,5 секунды).
Примеры (которые являются правильными):
n = 1620
выходы{2, 3, 5}
n = 2048
выходы{2}
n = 4096
выходы{2}
Если число 'a' равномерно делит другое число' b', 'a' должно быть половиной' b' или меньше. Исправьте цикл 'for', и вы должны сделать гораздо меньше вычислений. – DaaaahWhoosh
Используйте сито Эратосфена, чтобы предварительно вычислить все простые числа от 2 до квадратного корня целого числа. Сохраните все простые числа в наборе, а затем ваша функция 'is_prime' просто станет поиском в наборе. Кроме того, при создании сита сделайте свое условие 'i * i
Coda17
@DaaaahWhoosh, вы ссылаетесь на цикл в 'p1()'? – Victor