Ситуация
После работы над катом кодирования Наконец-то я заставил алгоритм работать на моих небольших тестовых примерах.
Только чтобы узнать, что он не работает в больших масштабах, проблема не во времени, а в размере чисел.
В одном из мои расчеты в одном из тестовых случаев мне нужно выполнить следующий расчет.
var numberOfColumns = 34359738368;
var numberOfRows = 28827050410;
var valueOverflow = 13719506;
var totalOfSingleRow = (numberOfColumns * (numberOfColumns - 1))/2;
var totalGridValue = totalOfSingleRow * numberOfRows;
var result = (totalOfSingleRow * totalGridValue) % valueOverflow;
Поскольку верхняя строка является последовательной, я могу вычислить сумму первой строки, выполнив (numberOfColumns * (numberOfColumns - 1))/2;
.
Затем мне нужно умножить этот ответ на количество строк и применить модуль, чтобы получить результирующее значение.
Проблема
Проблема в том, что Javascript может вычислить надежность только с числом меньше 9007199254740991
.
Только приведенный выше расчет дает totalGridValue
из 17016487081526963049249353236480
.
Вы можете себе представить, что мой расчет не приводит к желаемому значению 10552574
, так как значение усекается до 1,7016487081526963e+31.
Это приводит к неправильному значению 8479672
Вопрос
Как я могу изменить свой расчет, чтобы результат стал желаемым 10552574
.
Я пытался применить оператор по модулю раньше к numberOfColumns
без желаемого результата.
Я' Я также рассматривал добавление двух больших значений в виде строк, но этот процесс стал бы медленным, так как мне приходилось добавлять две строки много раз.
Примечание
Поскольку мне нужно отправить это на codewars, я не могу использовать какие-либо внешние библиотеки!
Хотя я могу использовать другие языки, но я знаю, что это возможно в javascript.
(A*B)%M = ((A%M)*(B%M))%M
. - person Sanket Makani   schedule 26.01.2018c % n * ((c-1) / 2 % n) % n
. При условии, что c-1 — четное число, если c-1 — нечетное число, формула(c-1) % n * (c / 2 % n) % n
- person Rick Hoving   schedule 01.03.2018