Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
#1

Длинная целочисленная арифметика на c++ - C++

24.05.2011, 07:37. Просмотров 1262. Ответов 1
Метки нет (Все метки)

Я в курсе существования готовой длинной арифметики, но в этой, например, теме есть такие посты:
Цитата Сообщение от fasked Посмотреть сообщение
Все это понятно, я и сам могу перечислить еще как минимум три подобных пакета. Однако, если требуется собственная реализация, то они не помогут. Да и "тупое" их использование мало покажет основные принципы.
,
Цитата Сообщение от fasked Посмотреть сообщение
Я же сказал, что в первую очередь делаю это для себя. А если уж кому будет не лень, то разобраться в моей библиотеке будет куда проще, чем в том же GMP. К тому же я все таки надеюсь на какую-то помощь. Потому что библиотеки как таковой еще не существует.
Здесь будет аналог той темы, но на c++. Внутреняя реализация - свой union трёх массивов: массива байт, массива двубайтных целых и массива четырёхбайтных целых, причём, общий блок памяти занимают только сами массивы, но указатели на них располагаются в раздельных ячейках и просто имеют совпадающие значения. Разрядность 1024 байта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class LongInteger
{
 protected: 
  uint8_t   Bytes[1024];
  uint16_t *Words;
  uint32_t *DoubleWords;
 public: 
  LongInteger ();
};
LongInteger::LongInteger ()
{
 Words      =(uint16_t*)(Bytes);
 DoubleWords=(uint32_t*)(Bytes);
}
Добавлено через 11 минут
Теперь такая проблема: есть разные порядки байт и слов. Порядков байт в слове существует два: младший в млашем и старший в младшем, то есть если в том порядке, в каком в памяти валяются байты, записать их номера, то может полчисться и 01 и 10. Точно также есть два порядка слов в двойном слове и не всегда он совпадает с порядком байт. При совпадении получаем порядок байт в двойном слове или 0123, или 3210 (те же младший в младшем и старшщший в младшем), но при несовпадении получаются 1032 и 2301, в этих порядках младшие и старшие байты находятся рядом и в середине. Передложите тест порядка байт и слов и внутренний формат для хранения его результатов. Кстати, есть ли вообще несуразины типа, например, 0321?

Добавлено через 12 минут
По критикуйте такое решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class LongInteger
{
 protected:
  uint32_t  Order; // Порядок байт в двойном слове: 0x03020100=3210, 0x02030001=2301, 0x01000302=1032, 0x00010203=0123
  uint8_t   Bytes[1024];
  uint16_t *Words;
  uint32_t *DoubleWords;
 public: 
  LongInteger ();
};
LongInteger::LongInteger ()
{
 uint8_t *OderByBytes; 
 OderByBytes   =Oder;
 OderByBytes[0]=3; // Для теста порядка в поле Order побайтно пишется значение 0x03020100.
 OderByBytes[1]=2; // Для теста порядка в поле Order побайтно пишется значение 0x03020100.
 OderByBytes[2]=1; // Для теста порядка в поле Order побайтно пишется значение 0x03020100.
 OderByBytes[3]=0; // Для теста порядка в поле Order побайтно пишется значение 0x03020100.
 Words         =(uint16_t*)(Bytes);
 DoubleWords   =(uint32_t*)(Bytes); 
}
. Сам вижу, что для условной компиляции это не пойдёт. С этим можно бороться? Как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 07:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Длинная целочисленная арифметика на c++ (C++):

Длинная арифметика. - C++
Даны два длинных числа a и b. Найти частное и остаток при делении числа a на b. Не могу реализовать деление отрицательных чисел. Помогите...

Длинная арифметика - C++
Срочно нужны исходники (функции): 1. Перевод обычного числа в длинное (массив, строка , вектор кто с чем работает) 2. Нахождение суммы...

Длинная арифметика - C++
:senor: Здраствуйте, пишу модуль длинной математики. В принципе, работоспособность у него положительная. Но в силу моей неопытности меня...

Длинная арифметика - C++
Мне дали задание с вычеслениями длинной арифметики. С мысл в том что там все действия происходят с символьными масивами. Я так и не...

Длинная арифметика - C++
Здравствуйте помогите пожалуйста с задачкой на с++ борландс :wall: 1. "Вычислить точное значение (n!)! " 2. "Для заданной...

длинная арифметика - C++
Долгое время бьюсь как составить программу по этой теме в интернете искал нашел это for (int i=(int)s.length(); i>0; i-=9) if (i < 9) ...

1
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
26.05.2011, 15:34 #2
Все гораздо проще реализуется с использованием стандартного вектора...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 15:34
Привет! Вот еще темы с ответами:

Длинная арифметика - C++
Помогите реализовать длинную арифметику #include <iostream> #include <string> using namespace std; int main(){ int a; string...

Длинная арифметика - C++
Помогите пожалуйста дорешать программу, она считает 2 в 200 степени, я коечто написал, но препод сказал, что прога выдаёт не полное число,...

Длинная арифметика - C++
class BigInt { static const int max_size = 100000;//количество десятичных разрядов, которые должно вмещать static...

Длинная арифметика - C++
Привет всем! помогите пожалуйста кодом. Необходимо реализовать операцию сравнения двух длинных чисел A>=B Заранее спасибо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru