K-й наибольший множитель числа N
Даны два положительных целых числа N и K , задача состоит в том, чтобы вывести K-й наибольший множитель числа N.
Input: N = 12, K = 3
Output: 4
Explanation: The factors of 12 are {1, 2, 3, 4, 6, 12}. The largest factor is 12 and the 3rd largest factor is 4.Input: N = 30, K = 2
Output: 15
Explanation: The factors of 30 are {1, 2, 3, 5, 6, 10, 15, 30} and the 2nd largest factor is 15.
Подход: Идея состоит в том, чтобы проверить каждое число в диапазоне [N, 1] и вывести K-е число, которое полностью делит N.
Итерация по циклу от N до 0 . Теперь для каждого числа в этом цикле:
- Проверьте, делит ли он N или нет.
- Если N делится на текущее число, уменьшите значение K на 1.
- Когда K становится равным 0, это означает, что текущее число является K- м наибольшим множителем N.
- Выведите ответ в соответствии с приведенным выше наблюдением.
Ниже приведена реализация вышеуказанного подхода:
Сложность времени: 
Вспомогательное пространство: 
Эффективный подход: проблема может быть решена оптимизированным способом по сложности sqrt(n) , используя тот факт, что множители любого числа остаются в виде пар . Другими словами, если i является множителем числа n , то n/i также будет множителем числа n . Итак, чтобы найти все множители числа, нам нужно проверить множители до sqrt(n) и их соответствующие пары. В статье используется аналогичный подход: найти делители натуральных чисел.
Иллюстрация:
Если n = 80, то все возможные пары делителей: (1,80), (2,40), (4,20), (5,16), (8,10). Следовательно, чтобы сохранить все множители 80, мы будем повторять цикл от 1 до √80 ≈ 8 и сохранять множители в диапазоне (который в данном случае включает 1,2,4,5,8). После этого мы запускаем обратный цикл и сохраняем пары этих предыдущих факторов (что даст 10, 16, 20, 40 и 80). Здесь мы запускаем обратный цикл, чтобы получить пары в возрастающем порядке. Таким образом, мы получим все множители, включающие {1, 2, 4, 5, 8, 10, 16, 20, 40 и 80}.
Подход:
- Инициализируйте вектор, чтобы хранить элементы в возрастающем порядке.
- Сначала выполните цикл от 1 до sqrt(n) и сохраните все факторы.
- Затем повторите цикл в обратном порядке и для каждого фактора сохраните соответствующую пару. Итак, если я - фактор, сохраните n/i .
- Если размер вектора больше или равен k, верните k-й наибольший фактор (который будет v[v.size()-k] , поскольку вектор v находится в порядке возрастания).
- Если k элементов не существует, это означает, что нет k-го по величине фактора и, следовательно, возвращается -1 .
Обработка угловых случаев:
Крайний случай возникает, когда любой фактор точно равен sqrt (n). Например, если n=100, то в этом случае множителем числа будет 10, а также соответствующая ему пара 10 как (10*10=100). Таким образом, в этом случае 10 будет взято два раза. Чтобы решить этот случай, мы используем оператор if между двумя циклами и устраняем проблему, учитывая этот фактор только один раз.
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O (sqrt (n))
Вспомогательное пространство: O(m), где m — общее количество факторов n.