如何在c ++中将大数字字符串转换为整数?

时间:2017-08-14 07:33:29

标签: c++ string integer long-integer

假设我在c++中输入了一个长字符串编号。我们必须对它进行数值运算。我们需要将其转换为integer或任何可能的操作方式,这些是什么?

string s="12131313123123213213123213213211312321321321312321213123213213";

3 个答案:

答案 0 :(得分:2)

你最好的方法是使用大量的计算库。

最好的一个是GNU Multiple Precision Arithmetic Library

解决问题的有用功能示例::

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

  

从str设置rop的值,str是以base为单位的以null结尾的C字符串   基础。字符串中允许有空格,只是被忽略。

     

基数可以在2到62之间变化,或者如果基数为0,那么前导   使用的字符:0x和0X表示十六进制,0b表示0B表示二进制,   0表示八进制,否则为十进制。

     

对于最多36的基数,忽略大小写;大写和小写字母   具有相同的价值。对于基数37到62,大写字母代表   通常的10..35而小写字母代表36..61。

     

如果整个字符串是base中的有效数字,则此函数返回0   基础。否则返回-1。

文档:https://gmplib.org/manual/Assigning-Integers.html#Assigning-Integers

答案 1 :(得分:2)

看起来你想要处理的数字对于任何标准整数类型都是大的,所以只是“转换”它不会给你很多。您有两种选择:

  1. (强烈推荐!)使用大整数库,例如gmp。这些库通常还提供解析和格式化大数字的函数。

  2. 自己实施大数据,例如使用 uintmax_t 数组来存储它们。你将不得不实施自己可能需要的各种算术,这不是一件容易的事。要解析数字,您可以使用反向double dabble 实现。作为一个例子,这里是我之前在C中编写的一些代码,您可以使用 as-is ,但是您需要提供一些辅助函数,您可能希望使用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 :(得分:0)

如果字符串包含的数字小于std::numeric_limits<uint64_t>::max(),则std::stoull()是最好的意见。

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

C++11以及之后。