Вы можете сделать это за O (n): первый ход - получить произведение всех элементов массива (P) и второй ход - при условии, что в начале левая часть равна единице, а вторая - P, на каждом шаге iумножить влево на X [i] и разделить вправо на X [i].Продолжайте процесс, пока слева не станет меньше, чем справа.
Поскольку у вас большой массив чисел, вам нужно некоторое умножение больших чисел.Так что, может быть, вам лучше перейти к массиву логарифмов A [i], LA [i] и перейти к новым критериям.
Редактировать:
Как уже упоминалось @CiaPan, точность стандартного 64-разрядного десятичного числа недостаточна для выполнения операции регистрации (поскольку значения могут быть до 10^ 18).
Таким образом, чтобы решить эту проблему, вы должны сначала разбить значения исходного массива на пары таким образом:
s[2*i] = a[i].toDouble / (10.0^9)
s[2*i+1] = a[i]/s[2*i]
Массив s в два раза длиннее исходного массива a, но его значения не превышают10 ^ 9, так что можно безопасно применить операцию регистрации, затем найти нужный sX для массива s и разделить его на 2, чтобы получить X для массива a.
Логика сверхточности логарифма не требуется.