Как преобразовать строки большого числа в целое число в C ++?

Предположим, у меня есть длинный номер строки в c++, и мы должны сделать числовые операции над ним. Нам нужно преобразовать это в integer или любой возможный способ сделать операции, что это?

string s="12131313123123213213123213213211312321321321312321213123213213";

1

Решение

Похоже, числа, которые вы хотите обработать, слишком велики для любого стандартного целочисленного типа, поэтому простое «преобразование» не даст вам много. У вас есть два варианта:

  1. (Настоятельно рекомендуется!) Использовать большое целое библиотека как например gmp. Такие библиотеки обычно также предоставляют функции для анализа и форматирования больших чисел.

  2. Внедрите свои большие числа сами, вы можете, например, использовать массив uintmax_t хранить их. Вам нужно будет реализовать все виды арифметики, которые могут вам понадобиться, и это не совсем простая задача. Для разбора числа вы можете использовать обратная двойная игра реализация. В качестве примера, вот код, который я написал некоторое время назад в C, вы, вероятно, можете использовать его как есть, но вам нужно предоставить некоторые вспомогательные функции, и вы можете переписать их с помощью таких средств C ++, как std::string и заменить struct используется здесь с std::vector — это просто здесь, чтобы документировать концепцию

    typedef struct hugeint
    {
    size_t s;       // number of used elements in array e
    size_t n;       // number of total elements in array e
    uintmax_t e[];
    } hugeint;
    
    hugeint *hugeint_parse(const char *str)
    {
    char *buf;
    
    // allocate and initialize:
    hugeint *result = hugeint_create();
    
    // this is just a helper function copying all numeric characters
    // to a freshly allocated buffer:
    size_t bcdsize = copyNum(&buf, str);
    
    if (!bcdsize) return result;
    
    size_t scanstart = 0;
    size_t n = 0;
    size_t i;
    uintmax_t mask = 1;
    
    for (i = 0; i < bcdsize; ++i) buf[i] -= '0';
    
    while (scanstart < bcdsize)
    {
    if (buf[bcdsize - 1] & 1) result->e[n] |= mask;
    mask <<= 1;
    if (!mask)
    {
    mask = 1;
    // this function increases the storage size of the flexible array member:
    if (++n == result->n) result = hugeint_scale(result, result->n + 1);
    }
    for (i = bcdsize - 1; i > scanstart; --i)
    {
    buf[i] >>= 1;
    if (buf[i-1] & 1) buf[i] |= 8;
    }
    buf[scanstart] >>= 1;
    while (scanstart < bcdsize && !buf[scanstart]) ++scanstart;
    for (i = scanstart; i < bcdsize; ++i)
    {
    if (buf[i] > 7) buf[i] -= 3;
    }
    }
    
    free(buf);
    return result;
    }
    
2

Другие решения

Лучше всего было бы использовать вычислительную библиотеку больших чисел.

Один из лучших Многофункциональная арифметическая библиотека GNU

Пример полезной функции для решения вашей проблемы:

Function: int mpz_set_str (mpz_t rop, const char *str, int base)

Установите значение rop из str, строки C с нулевым символом в конце в базе
база. Пробел допускается в строке и просто игнорируется.

База может варьироваться от 2 до 62, или если база равна 0, то ведущая
используются символы: 0x и 0X для шестнадцатеричного, 0b и 0B для двоичного,
0 для восьмеричного или десятичного в противном случае.

Для баз до 36, случай игнорируется; прописные и строчные буквы
имеют одинаковое значение. Для оснований от 37 до 62 заглавные буквы представляют
обычное значение 10..35, тогда как строчные буквы обозначают 36..61.

Эта функция возвращает 0, если вся строка является действительным числом в базе
база. В противном случае возвращается -1.

Документация: https://gmplib.org/manual/Assigning-Integers.html#Assigning-Integers

2

Если строка содержит число, которое меньше std::numeric_limits<uint64_t>::max(), затем std::stoull() это лучшее мнение.

unsigned long long = std::stoull(s);

C++11 и позже.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector