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

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

Войти
Регистрация
Восстановить пароль
 
SerVal
23 / 23 / 2
Регистрация: 16.04.2015
Сообщений: 208
#1

Как компактно отображать и хранить большие числа? - C++

25.07.2015, 11:48. Просмотров 314. Ответов 2
Метки нет (Все метки)

Есть ли какой-нибудь общеупотребимый формат? Типа 3*(2^123456-1)

Сейчас развлекаюсь с числами Мерсенна. Для них просто придумал "М23", "М24"..
*таблица известных чисел Мерсенна http://primes.utm.edu/mersenne/index.html#known

Ну, и чтобы в программе можно было писать:
BigInt BigInt1 = BigInt::FromCompactString("3*(2^123456-1)");
String str = BigInt::GetCompactString(BigInt1);

Интересует формат, который годился бы для любого натурального числа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2015, 11:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как компактно отображать и хранить большие числа? (C++):

Компактно разместить числа в переменной размером в 3 байта - C++
0 <= a <= 12, 0 <= b <= 9, 1900 <= c <= 2005, 0 <= d <= 31, 0 <= e <= 1 Компактно разместить числа в переменной размером в 3...

Очень большие числа: узнать, есть ли остаток от деления одного числа на другое - C++
Требуется узнать, есть ли остаток от деления одного числа на другое. Оба числа много больше int64, ~1000 символов и больше. Я попытался...

Ввести с клавиатуры 10 чисел. Если среди них есть числа, большие 15, заменить их на 15. Напечатать все полученные числа - C++
Ввести с клавиатуры 10 чисел. Если среди них есть числа, большие 15, заменить их на 15. Напечатать все полученные числа.

Ввести с клавиатуры 10 чисел. Если среди них есть числа большие 15, заменить их на 15. Напечатать все полученные числа. - C++
Помогите решить задачу в Turdo C++, там где используется printf scanf: Ввести с клавиатуры 10 чисел. Если среди них есть числа большие...

Массив: Слишком большие числа в массиве, хотя стоят ограничения диапазона (-100,100), как мне исправить это? - C++
Доброго времени суток. У меня выходят слишком большие числа в массиве, хотя стоят ограничения диапазона (-100,100), как мне исправить...

большие числа - C++
скажите пожалуйсто есть ли какая нибудь библиотека в си++ для работы с большими числами (до 10^18), если нет то может у кого класс...

2
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.07.2015, 12:08 #2
Длинное число заведомо содержит много информации, в компактном представлении её заведомо мало. Есть исключение: если дополнительная информация содержится в принадлежности к определённой последовательности, чем ограничено множество возможных значений, то сама запись может быть короткой, но тем не менее содержать всю информацию о числе. Но для абсолютно любого числа это не годится, так как оно может и не принадлежать заданной последовательности, а специально подгонять последовательность - надо описать её, а в описании должна быть недостающая информация о числе. Поэтому абсолютно любое можно только с некоторой ограниченной точностью. И вот для этого то есть отличное представление, вполне общепринятое: нотация с плавающей запятой. Но для гигантских чисел и она не компактна, так как и порядок тоже может иметь много знаков. Например, http://www.cyberforum.ru/cgi-bin/latex.cgi?2.414*10^{446545646994646448945454959595545454544878887421561231454684654564564868454154564564651564848454847847123156468768421234876142123} компактностью не страдает.
0
SerVal
23 / 23 / 2
Регистрация: 16.04.2015
Сообщений: 208
25.07.2015, 12:38  [ТС] #3
Сейчас всё отображается тот так:

D:\aProjects\TestBigInt\x64\Release>TestBigInt.exe -power M47
--- power() test ---
Generating Mersenn number M47 = power(2, 43112609) - 1
Generation complete:
M47 : 316470269 .... 697152511
M47 : число цифр = 12978189
M47 : число сегментов = 1442021
Exec time : 203.18 seconds.
***
*это внутреннее представление. Хотелось бы одной короткой строкой.

Добавлено через 29 минут
А может вычислить факториал, который поближе к числу?
Например:

>TestBigInt.exe -factorial 5
Calculating factorial: 5
Big integer : 120
number of decimal digits = 3
number of segments = 1
Exec time : 0 seconds.

Тогда число можно будет представить как факториал плюс остаток:
число 123 = "5!+3".
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2015, 12:38
Привет! Вот еще темы с ответами:

Большие числа - C++
Здравствуйте. Как в С++ работать с большими числами (600851475143, например)? Честно гуглил, но там ничего толкового не нашел. ...

Большие числа в C - C++
можно ли в языке С работать с большими целыми? Существует ли некое подобие BigInteger C#?

Выводятся большие отрицательные числа - C++
В функции max двумерный массив переводится сначала в одномерный, при выводе одномерного массива вместо правильных элементов выводятся...

Strtol и слишком большие числа - C++
Если strtol скормить строчку со слишком большим числом, оно вернет LONG_MAX и установит errno в ERANGE. Вопрос - если strtol скормить...


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

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

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