Чтобы это работало с n, равным 10 ^ 1000, вам определенно необходимо использовать реализацию BigNumber для арифметических операций.
Поскольку вы используете программную реализацию дляарифметические операции, которые означают, что их временная сложность, вероятно, будет зависеть от размера (числа бит) чисел, с которыми вы будете работать.В дополнение к этому, сложность, вероятно, будет линейной, а для умножения она будет квадратичной или, в любом случае, сверхлинейной.
В этом случае все, что вам нужно сделать, это включить эту сложность в свой алгоритм выше, чтобысложная сложность.
Например, если у вас есть:
for i = 2 to n
<multiplication operation>
Предполагая, что умножение является квадратичным по размеру (# бит) n, то O(mult) = (log n) ^ 2
.Тогда сложность большого цикла цикла for будет равна:
n * O(mult) = O(n * ((log n) ^ 2))
В вашем примере цикл for содержит три потенциально "дорогих" операции:
for i = 2 to n
e *= 10 // e = e * 10
sum += i * e // sum = sum + i * e
.дорогостоящие операции: mult1: e*10
, mult2: i * e
и add: sum + (result of i*e)
Их совокупная сложность составит O(mult1 + mult2 + sum)
, что примет значение наибольшего из трех.В этом случае, безусловно, mult2
Так что, если вы можете получить оценку для операции умножения, то общая сложность будет, как указано выше: n * O(mult)
, что опять-таки, предполагая квадратичную реализациюв размере чисел, собирается перевести что-то вроде: O (n * log (n))
Что касается оценки характеристик времени выполнения арифметических операций, вот хорошая таблица изВикипедия различных алгоритмов для основных арифметических операций .