В настоящее время я использую, возможно (или очевидно) несколько наивный способ непрерывного вычисления модуля и остатка путем деления на десять.
Тогда у вас должна быть O(n^2)
сложность, которая должна быть намного лучше, чем 15 минут.
Хотя стоит посмотреть, как именно вы делите на 10
.
- Убедитесь, что вы применяете не общее деление длинных на длинные, а более простой алгоритм деления длинных чисел на стандартные.
- Убедитесь, что вы повторно используете память. Выделение блоков по 10 Кбайт 10000 раз наверняка ухудшит вашу производительность.
редактировать
Как разделить длинное двоичное число на 10 за один проход и получить результат и напоминание. Без дополнительной памяти.
Простой псевдокод (a[0]
является цифрой высшего порядка)
int r = 0;
for (int i = 0; i < n; ++i) {
r = r * 2 + a[i];
a[i] = r / 10;
r = r % 10;
}
Давайте рассмотрим пример, число 100111011 = 315
.
Шаг 0: r = 1, a[0] = 0
Шаг 1: r = 2, a[1] = 0
Шаг 2: r = 4, a[2] = 0
Шаг 3: r = 9, a[3] = 0
Шаг 4: r = 9, a[4] = 1
Шаг 5: r = 9, a[5] = 1
Шаг 6: r = 8, a[6] = 1
Шаг 7: r = 7, a[7] = 1
Шаг 8: r = 5, a[8] = 1
Итак, напоминание - 5
, а результат - 000011111 = 31
.