Дан следующий прототип функции, которая должна возвращать вектор всех делителей числа 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, и соответственно найденные делители запихивать с разных сторон.
Более сложный в реализации - но и более быстрый - вариант заключается в поиске всех простых делителей и генерации из них полного списка делителей.
Как меняется крипторынок и к чему готовиться владельцам криптообменников
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Давно учил С++, уже его подзабыл, но сейчас необходимо решить заданиеБуду благодарен любой помощи!
Создаю на плюсах нестандартное окно по png рисунку через UpdateLayeredWindowКак на этом окне отобразить стандартные контролы? В частности меня интересуют...