Все делители числа

194
10 июля 2017, 18:01

Дан следующий прототип функции, которая должна возвращать вектор всех делителей числа 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;
}

Но вектор получается неотсортированный. Есть идея добавлять маленькие значения в один вектор, а большие в другой, а потом их соединить в один, но непонятно, как это сделать без копирования, не превысив заданную сложность.

Answer 1

Во-первых, у вас все равно получится не больше корня из n делителей в каждом векторе, так что копирование вам опять же даст ту же сложность - можно смело его использовать.

Но можно просто взять дек, а работать начать от корня вниз, к 1, и соответственно найденные делители запихивать с разных сторон.

Более сложный в реализации - но и более быстрый - вариант заключается в поиске всех простых делителей и генерации из них полного списка делителей.

READ ALSO
Приватный член в обьявлении

Приватный член в обьявлении

Есть не статический метод:

193
Небольшая программа на C++

Небольшая программа на C++

Давно учил С++, уже его подзабыл, но сейчас необходимо решить заданиеБуду благодарен любой помощи!

231
c++ UpdateLayeredWindow

c++ UpdateLayeredWindow

Создаю на плюсах нестандартное окно по png рисунку через UpdateLayeredWindowКак на этом окне отобразить стандартные контролы? В частности меня интересуют...

291
Fonts error в консоли веб-приложения

Fonts error в консоли веб-приложения

С чем могут быть связаны такие проблемы?

250