Как Вы храните произвольно большое целочисленное значение в памяти?

Я должен сохранить целочисленное значение, которое больше, чем максимальное значение для длинного типа данных. Как я сохранил бы и управлял бы этим значением в памяти?

Проиллюстрируйте его через пример, если это возможно.

10
задан Darkshadows 18 August 2017 в 19:37
поделиться

6 ответов

Если это только для отображения, я бы предложил (для печально известного printf) из стандартной библиотеки c или, может быть, для внесения некоторых изменений.

-1
ответ дан 3 December 2019 в 14:18
поделиться

Возможные решения:
1) Определите настраиваемый целочисленный тип, достаточно большой, чтобы вместить это значение. 128-битное целое число достаточно велико, чтобы вместить 98474737475747374739399.
2) Используйте любую доступную библиотеку bignum .

8
ответ дан 3 December 2019 в 14:18
поделиться

Это обычный вопрос на вводных занятиях по информатике в университете. Основными направлениями являются а) понимание того, как (целые) числа хранятся в виде двоичных цифр, и б) основы структур данных, где, если язык программирования не предоставляет нужную структуру данных сам, вы можете использовать мета или структуры коллекций, такие как struct в C, class в C++ или record в Pascal.

Как же хранится меньшее целое число в компьютере? В Си есть типы данных char, short, int, long, которые можно использовать для хранения целых чисел различных размеров. (Я буду игнорировать long long для этого обсуждения.) Предположим для общности, что на данной 32-битной платформе размеры 8-бит, 16-бит, 32-бит и 64-бит соответственно. Рассмотрим значения, которые могут быть представлены (для упрощения считаются беззнаковыми).

Итак, как можно хранить большее целое число, которое нельзя хранить в беззнаковом 64-битном long? Создайте свой собственный большой целочисленный тип данных, состоящий из нескольких меньших (но стандартных) целых чисел так, чтобы они представляли большие значения.

Я думаю, это должно направить вас в правильном направлении, и вы сможете написать свой собственный ответ на домашнее задание или экзаменационный вопрос.

2
ответ дан 3 December 2019 в 14:18
поделиться
    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
    }
0
ответ дан 3 December 2019 в 14:18
поделиться

Я не буду давать вам код, но могу сделать пару предложений, которые следует использовать:

  1. Попробуйте сохранить значение в виде символа строка и преобразование для выполнения вычислений
  2. Попробуйте разбить значение на несколько целых чисел, представляющих часть значения
  3. Найдите существующие библиотеки, которые могут позаботиться об этом за вас

Удачи

{{1} }
4
ответ дан 3 December 2019 в 14:18
поделиться

Подумайте о хранении чисел в виде последовательностей десятичных цифр, используя такую ​​структуру:

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 на другое (игнорируя остатки) ? Это сложнее, чем умножение, но опять же, начните с нескольких длинных делений карандашом и бумагой и тщательно подумайте о том, что вы делаете.
20
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: