c ++中从字符串到int的大数字

时间:2015-04-17 03:02:12

标签: c++ string int long-integer

在我提出这个问题之前,我做了一些搜索。我尝试使用unsigned int,然后使用strtoul将字符串转换为unsigned int。 甚至像

这样简单的代码
 unsigned int num = 99999999999999999999999999999999999999999999999999999999999999999999999999999999

此代码仍无效。我希望能够做到这样的事情:

     unsigned int num = 99999999999999999999999999999999999999999999999999999999999999999999999999999999;
     unsigned int num2 = 1;
     unsigned int ans = num + num2;

我希望能够做到这样的事情:

 string num1 = "99999999999999999999999999999999999999999999999999999999999999999999999999999999;"
 string num2 = "1"
 string conv_ans;

 unsigned int conv1 = strtoul(num1); 
 unsigned int conv2 = strtoul(num2); 
 unsigned int ans = conv1 + conv2;

 conv_ans = ans;

谢谢!

2 个答案:

答案 0 :(得分:3)

  

我希望能够做到这样的事情

你不能。

unsigned int无法存储大于的值 std::numeric_limits<unsigned int>::max()。通常这大约是40亿。

要存储和管理任意大小的整数,例如银河系中的原子数(大致是您的数字),您需要使用“大型int”库,例如GMP

答案 1 :(得分:2)

正如@Drew的回答中所提到的,没有C ++内置类型可以存储您想要的整数。一个快速且易于使用的多精度库随Boost一起提供,它被称为Boost.Multiprecision。它是reasonably fast,编写使用它的代码是轻而易举的(不需要预编译的头文件或其他共享库,只需要-I /path/to/boost)。例如,计算factorial(1000)(这是一个非常大的数字)看起来像

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>

int main()
{
   using namespace boost::multiprecision;

   cpp_int u = 1; // multi-precision integer
   for(int i = 1; i < 1000; ++i) // compute 1000!
      u *= i;

   std::cout << u << std::endl; // prints 1000!
}

Boost.Multiprecision的一个优点是它与C ++流库非常好地集成,您基本上可以将它用作内置类型。该库还支持浮点数,有理数等(参见文档)。

此外,Boost是最“标准化”的C ++库之一(Boost的许多功能最终都在C ++ 11中使用),并且使用率很高,所以你可以尝试一下。