|
40 / 13 / 8
Регистрация: 15.12.2009
Сообщений: 70
|
|||||||||||||||||||||
"Учу" длинную арифметику14.07.2011, 20:46. Показов 5105. Ответов 12
Метки нет (Все метки)
Доброго времени суток. Начал пробывать реализовывать длинную арифметику на шарпе, но вышло очень криво, соответственно очень долго(это слабо сказанно). Подскажите как можно оптимизировать. Прошу не писать что-то вроде "Пиши на плюсах" и др. Интересует только шарп.
Сумма
0
|
|||||||||||||||||||||
| 14.07.2011, 20:46 | |
|
Ответы с готовыми решениями:
12
на длинную арифметику. |
|
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
|
||||||
| 14.07.2011, 21:19 | ||||||
Сообщение было отмечено как решение
Решение
Предложу вариант попроще, если требуется не именно разработка метода своими руками.
3
|
||||||
|
40 / 13 / 8
Регистрация: 15.12.2009
Сообщений: 70
|
|
| 14.07.2011, 21:22 [ТС] | |
|
Спасибо конечно большое, однако хочется самому поучится делать такие вещи.
0
|
|
|
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
|
|
| 14.07.2011, 21:48 | |
|
А, окей)
Тогда, во-первых, лучше выкинуть все операции со строками - все эти Convert.ToInt16 и ToString очень тормозные. Оставьте их только при вводе чисел, а в самом начале метода, например, разбейте их на байтовые массивы - по разрядам. Потом - при сложении, по-моему, нет никакой необходимости дополнять числа нулями до одинаковых длин. Во-первых, это просто не нужно - определите сначала длину меньшего числа, и ограничьте цикл ей +1 (на случай, если будет остаток в старший разряд). Когда цикл кончается, оставшиеся цифры большего числа просто приписываются к результату слева. Во-вторых, представьте, сколько вы сэкономите времени, когда в примере типа 598374508923540872648572689475623865283+ 1 избавитесь от 1 -> 000000000000000000000000000000000000001 3+1=4; 8+0=8; 2+0=2; 5+0=5... И при этом каждая цифра парсится в int, а потом обратно. Конечно, оно тормозит. Вычитание: а зачем писать отдельный метод, когда оно ничем не отличается от сложения? Просто опять же, когда будете переводить в массив - умножьте каждое число на -1, и метод сложения будет так же работать. При этом остаток, который переносится в старший разряд, будет получаться отрицательным - когда "занимаем" единицу. Умножение: вы используете "столбиком", умножая число на все цифры по очереди. Есть довольно неплохой выбор алгоритмов быстрого умножения - самый быстрый, емнип, все еще алгоритм Карацубы. Один из самых простых алгоритмов переделан из быстрого возведения в степень: 0. Есть числа a и b 1. Переводим a в двоичную систему 2. Считываем подряд символы (единицы и нули) из a, отбросив первый символ 3. Сохраним изначальное число b как b0 4. На каждом шаге, если полученный символ=0, то b=2b. Если символ=1, то b=2b+b0 Пример: 2*5. 5 в двоичной системе = 101. Отбрасываем первую единицу, остается 01. Первый символ равен 0: умножаем 2 на 2, получаем 4. Второй символ равен 1: умножаем 4 на 2 и прибавляем 2 - получаем искомые 10. Алгоритм не очень выгоден для маленьких чисел (2*5 мы бы получили одной операцией, а тут две), но для больших быстрее, чем столбиком.
2
|
|
|
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
|
|
| 14.07.2011, 21:50 | |
|
Попробуйте реализовать через китайскую теорему об остатках.
Дает хороший выигрыш в скорости на * и / Размер чисел ограничен только разумными пределами
1
|
|
|
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
|
|||
| 14.07.2011, 22:21 | |||
|
Добавлено через 7 минут
1
|
|||
|
40 / 13 / 8
Регистрация: 15.12.2009
Сообщений: 70
|
|||||||||||
| 14.07.2011, 22:50 [ТС] | |||||||||||
|
TO:somethingrotten
Очень много дельный советов - особенно с нулями - спасибо. А вот с вычитанием я тоже не понял... я ведь их взаимозаменяю когда необходимо
Просто когда делаешь что-то на подобии суммы всех чисел от одного до 1000 в степени этого же числа используя вышеупомянутый код, может уйти больше часа... Всё-таки без определённых алгоритмов никуда=) Насчёт long... не знаю склоняюсь всё таки к разбитию числа на байтовый массив... думаю так быстрее будет
0
|
|||||||||||
|
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
|
||||||||||||||||
| 14.07.2011, 23:31 | ||||||||||||||||
|
majesty1992, про вычитание я имел в виду, что у вас для него есть отдельный метод:
Насчет возведения в степень - просто обязательно юзать алгоритм, типа вышеприведенного, в оригинальной форме (формулы соответственно заменяются на b=b^2, если 0 и b=b0*b^2 если 1). Вдвойне обязательно - если это степень по модулю) Up. Кстати, чтобы сделать код проще и красивей, вместо String.Concat можно писать +=. Xero201, я не про результат операции, а про принцип работы сложения) Формула (а значит, метод) не изменится, если в нее подавать отрицательные числа - следовательно, нам нужен всего лишь один метод)
1
|
||||||||||||||||
|
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
|
|||||||
| 14.07.2011, 23:34 | |||||||
![]()
0
|
|||||||
|
40 / 13 / 8
Регистрация: 15.12.2009
Сообщений: 70
|
|
| 15.07.2011, 00:02 [ТС] | |
Dictionary<char, int> dic;не знаком с этой конструкцией Короче начну писать с нуля с байтовыми масивами. Я думаю, что если от строк избавлюсь эфективность увеличиться. Умножение - буду пробывать Карацубу.
0
|
|
|
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 299
|
||
| 06.05.2018, 18:56 | ||
|
somethingrotten, как и автор, пытаюсь написать класс для длинной арифметики чисел с плавающей запятой.
1234567,8901 ____432,1___ То, если я не ошибаюсь, придется привести эти числа к виду : 1234567,8901 0000432,1000 Иначе как тогда складывать их?
0
|
||
|
138 / 101 / 102
Регистрация: 03.02.2014
Сообщений: 427
|
||||||
| 06.05.2018, 20:12 | ||||||
|
Jesterru, можно попробовать использовать структуру на число, например
и делении ещё проще.
1
|
||||||
|
3 / 2 / 2
Регистрация: 19.06.2016
Сообщений: 299
|
|
| 07.05.2018, 15:47 | |
|
Антон1985, Я все таки решил, что лучше использовать 1 массив, содержащий и целую, и дробную части, а так же переменную, обозначающую позицию запятой. Для всех операций потребуется только 1 - правильно расположить массивы друг относительно друга, что делается достаточно просто при создании матрицы, даже Array.Resize делать не надо
Добавлено через 2 минуты Сложение - и так все ясно. Вычитание - есть некоторые сложности, но так же все ясно. Умножение - сложнее сложения, но проще вычитания. Деление - Это комбинация сравнения чисел и вычитания, т.е., по-моему, самое сложное, но состоит из простого
0
|
|
| 07.05.2018, 15:47 | |
|
Помогаю со студенческими работами здесь
13
Задачи на длинную арифметику Задача на длинную арифметику Задача на длинную арифметику Задача на «длинную арифметику» Знаете длинную арифметику? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|