Я должен сохранить целочисленное значение, которое больше, чем максимальное значение для длинного типа данных. Как я сохранил бы и управлял бы этим значением в памяти?
Проиллюстрируйте его через пример, если это возможно.
Если это только для отображения, я бы предложил
(для печально известного printf) из стандартной библиотеки c или, может быть,
для внесения некоторых изменений.
Возможные решения:
1) Определите настраиваемый целочисленный тип, достаточно большой, чтобы вместить это значение. 128-битное целое число достаточно велико, чтобы вместить 98474737475747374739399.
2) Используйте любую доступную библиотеку bignum .
Это обычный вопрос на вводных занятиях по информатике в университете. Основными направлениями являются а) понимание того, как (целые) числа хранятся в виде двоичных цифр, и б) основы структур данных, где, если язык программирования не предоставляет нужную структуру данных сам, вы можете использовать мета или структуры коллекций, такие как struct
в C, class
в C++ или record
в Pascal.
Как же хранится меньшее целое число в компьютере? В Си есть типы данных char, short, int, long
, которые можно использовать для хранения целых чисел различных размеров. (Я буду игнорировать long long
для этого обсуждения.) Предположим для общности, что на данной 32-битной платформе размеры 8-бит, 16-бит, 32-бит и 64-бит соответственно. Рассмотрим значения, которые могут быть представлены (для упрощения считаются беззнаковыми).
Итак, как можно хранить большее целое число, которое нельзя хранить в беззнаковом 64-битном long? Создайте свой собственный большой целочисленный тип данных, состоящий из нескольких меньших (но стандартных) целых чисел так, чтобы они представляли большие значения.
Я думаю, это должно направить вас в правильном направлении, и вы сможете написать свой собственный ответ на домашнее задание или экзаменационный вопрос.
struct digitcontainer
{
struct digitcontainer* left;
struct digitcontainer* right;
unsigned char digit;
}
struct longinteger
{
char sign;
struct digitcontainer* firstdigit;
}
// positive number with 1000 digits
void test()
{
struct longinteger myNumber;
myNumber.sign = '+';
myNumber.firstdigit = (struct digitcontainer*)malloc( sizeof(digitcontainer) );
myNumber.firstdigit->left = NULL;
myNumber.firstdigit->right = NULL;
myNumber.firstdigit->digit = 1;
struct digitcontainer* left = myNumber.firstdigit;
for( int i=1; i<1000; i++ )
{
left->right = (struct digitcontainer*)malloc( sizeof( digitcontainer ) );
left->right->left = left;
left->right->digit = (unsigned char)i;
left = left->right;
}
left->right = NULL;
// call free for each digitcontainer you are finished using the number
}
Я не буду давать вам код, но могу сделать пару предложений, которые следует использовать:
Удачи
{{1} }Подумайте о хранении чисел в виде последовательностей десятичных цифр, используя такую структуру:
struct num {
int ndigits;
char d[MAXDIGITS];
};
Например, число 123456 может быть инициализировано как
struct num n = { 6, { 6, 5, 4, 3, 2, 1 } };
Обратный порядок цифр важен для упрощения вычислений. В частности, значение места n.d [i]
равно n.d [i]
* 10 ^ i.
Теперь несколько вопросов:
num
? num
? num
вместе? num
на два? num
на одной цифрой? num
на 10? num
s вместе? ПОДСКАЗКА: сделайте несколько умножений карандашом и бумагой и посмотрите, как они работают. Если вы проработаете эту последовательность вопросов, вы сможете написать функцию для каждого шага и повторно использовать эти функции, чтобы ответить на последующие вопросы, и в итоге получить очень простой и неоптимизированный длинный (ну, до до MAXDIGIT
цифр) целочисленный пакет для сложения и умножения положительных чисел.
Другие вопросы:
num
для представления отрицательных и положительных чисел? num
на другое (игнорируя остатки) ? Это сложнее, чем умножение, но опять же, начните с нескольких длинных делений карандашом и бумагой и тщательно подумайте о том, что вы делаете.