![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
Доброе утро! Прявилась задачка необходимо реализовать работу с длинной вещественной арифметикой, перегрузив стандартные операторы. Вот возник вопрос. Я так понимаю число нужно будет хранить в массиве в каждом элементе разряд числа. Но числа же вещественные.
Вот пользователь ввел 2.000000000000000000000000044444444 444 Как учитывать числа которые идут до запятой и как их хранить. Они записываются в мантису и затем как-то определяется порядок и в конце на него умножают? Как это реализовать, если можно напишите код, реализация на с++ посмотрите правильно ли еще определила класс, свойства и методы класса вот мой код Код:
Единственное, что ограничивает полет мысли программиста-компилятор
Последний раз редактировалось Stilet; 06.04.2010 в 08:01. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Я реализовывал длинную арифметику в строках (скорость та еще, но мне было интересно). Умножение и деление по школьному, как в тетрадке без калькулятора
![]() Посмотрите внимательно на числа, запятая там не играет никакой роли. При умножении ее легко предсказать. Вообще просто достаточно хранить ее позицию в числе и смещать при операциях. Отдельно создавать массив для целой и массив для дробной части нет необходимости (и даже потом сложней будет писать реализацию). Собственно основными являются операции в котором участвует длинное (и целое) число и один разряд (то есть цифра от нуля до 9). Например, что бы написать полноценную функцию умножения Вам по сути нужно циклично умножать Ваше длинное число на разряды другого длинного и целого числа. Можете также поискать описание такого процесса (кажись рекурсивного) в функциональном программировании, как один из учебных примеров. Кажись первыми так додумались умножать древние египтяне. Собственно реализация через массив целых чисел будет более быстрой, но мне было лень создавать очереди и поэтому я применил строки (к тому же это сразу удобных контейнер для их хранения, нет нужды в различных преобразованиях при дальнейших манипуляций с ними). ЗЫ. Не люблю С++, потому что там есть манера всегда стремиться к ограничениям. Ну почему Count строго фиксировано? А если в результате умножения получиться число с числом разрядов более 300? А, все я в панике, хэлп, конец света? Именно поэтому я писал в строках - в Дельфи длина строк фактически не лимитируема и легко изменяема.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 06.04.2010 в 07:10. |
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
я как раз и собиралась использовать один массив в котором хранится и дробная и целая части, но вот пока не совсем поняла вот ввел пользователь 32.45 как его записать, как высчитать значенеие переменной por которая указывает на местоположение точки?
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Я сейчас точно не помню, кажись у меня шел отсчет запятой от дробной части (на Вашем примере будет не понятно, а для числа 123,45 запятая имела позицию 2 - фактически число цифр в дробной части). Далее, как пользователь введет длинное число? Только через массив char или через класс строки, значит ее положение нужно искать там
![]()
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
я вот тут подумала если вычислять позицию примерно вот таким образом, каждый раз число делим на 10 пока оно не станет меньше 1, и паралельно ведем подсчет количества раз деления. количество делений как раз и будет порядком. Правильно?
Ну вот как-то так: Код:
Единственное, что ограничивает полет мысли программиста-компилятор
Последний раз редактировалось Sparky; 06.04.2010 в 07:34. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Нет, не правильно. Я хочу ввести число 45646546546782156754465465444444444 444444444444455555555555555555
55555552222222222222222222222222224 444444444444444444444444444444 44555555555555555555555555888888888 8888888894654654445645.4564646 46464646798456751234546544121324645 13213545423132465487451248545 Как мне это сделать в Вашем проге? Да поймите, что длинная арифметика нужна для длинных чисел. А иначе зачем вся эта бодяга, если я его ввести не смогу?
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() |
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
сори что так пишу, но я пока просто хотела разабраться с механизмом вычисления порядка, он считается верно
Код:
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
![]()
Ну взгляните Вы шире. Храните числа в чем угодно, просто как это связано с вводом данных? Что Вам мешает получить строку? И разложить ее на символы?
Допустим строка X: String; Получаете ввод, обрезаете пробелы через Trim. Смотрите длину строки - вот Вам число введенных символов. Далее сканите символы - символ входит в множество всех цифр и точки (а также + и -)? Если да, то вносим его в массив и т.д. Если встретилась точка, то запоминаем число цифр дробной части (в случае если будете сканировать задом наперед) или вычитаете ее из длины (если начнете сканить от начала - с целой части) ну и т.д. ЗЫ. Единственное, что ограничивает полет мысли программиста - не способность взглянуть на задачу под другим углом зрения.
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика ![]() Последний раз редактировалось Utkin; 06.04.2010 в 08:03. |
![]() |
![]() |
![]() |
#9 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Я когда-то тоже длинкой интересовался, так у меня все числа были в Стринге. Туповато, зато просто.
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
Utkin, я поняла свою ошибку. Получается мне в любом случае нужно читать изначально число в строку, а затем уже засовывать элементы строки в массив целых и работать с ним
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Длинная арифметика | Indira | Общие вопросы C/C++ | 2 | 24.01.2010 10:28 |
длинная арифметика | Dimarik | Общие вопросы C/C++ | 1 | 16.09.2009 12:02 |
Длинная арифметика на C#(деление) | Mr_Dark | Общие вопросы .NET | 1 | 21.06.2009 21:57 |
Длинная арифметика | DmT | Помощь студентам | 2 | 06.10.2007 22:43 |