Дан следующий прототип функции, которая должна возвращать вектор всех делителей числа x в отсортированном порядке за O(n^1/2):
auto foo(int x) { // x > 0
std::vector<int> factors;
// input your code here
return factors;
}
Вот что я написал:
auto foo(int x) {
std::vector<int> factors;
for(int k = 1; k <= std::sqrt(x); ++k)
if (x % k == 0) {
factors.push_back(k);
if (k != std::sqrt(x))
factors.push_back(x / k);
}
return factors;
}
Но вектор получается неотсортированный. Есть идея добавлять маленькие значения в один вектор, а большие в другой, а потом их соединить в один, но непонятно, как это сделать без копирования, не превысив заданную сложность.
Во-первых, у вас все равно получится не больше корня из n делителей в каждом векторе, так что копирование вам опять же даст ту же сложность - можно смело его использовать.
Но можно просто взять дек, а работать начать от корня вниз, к 1, и соответственно найденные делители запихивать с разных сторон.
Более сложный в реализации - но и более быстрый - вариант заключается в поиске всех простых делителей и генерации из них полного списка делителей.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники