Недавно встала такая задача:
Дано некое положительное число, надо найти все его делители, кроме его самого.
Задача в том чтобы написать как можно более быстрый алгоритм, и конечно же
корректный.
Первая идея была, перебирать меньшие числа, проверяя на делимость, но полный
перебор не дал широких пределов применения, уже для решения задачи например для
, этот алгоритм работал очень долго, после нескольких модификаций
я получил вот такой вот алгоритм, верхняя оценка сложности в худшем случае
.
Алгоритм заполняет вектор детелями числа.
Код:
void find_divs( int n, vector<int> & divs ) {
int d, dlim, m = 1;
divs.push_back(1);
dlim = sqrt( n );
for ( d = 2; d <= dlim; ++d ) {
if ( n%d == 0 ) {
divs.push_back(m*d);
if ( m*d != n/d )
divs.push_back(n/d);
n /= d;
m *= d;
dlim = sqrt( n );
}
}
}
Можно ли как-то улучшить алгоритм? Или есть более быстрые методы решения этой задачи?