在我提出这个问题之前,我做了一些搜索。我尝试使用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;
谢谢!
答案 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中使用),并且使用率很高,所以你可以尝试一下。