如何在 C++ 中处理大至 2^9000000 的整数

How to work on intergers as large as 2^9000000 in C++

我所知道的正整数的最大数据类型是unsigned long long。有没有办法在 C++ 中处理大至 2^9000000 的整数。 我在代码块中使用 gcc 编译器,但也可以在 visual studio.

上工作

您需要某种 BigInt 库。我个人更喜欢 boost.multiprecision,因为它包含了普通代码编写者需要的大部分实用程序。

就您实际想要使用的内容而言,有两种明显的类型需要考虑。

  • 如果您只需要任意大小的整数,boost::multiprecision::cpp_int 是可行的方法,它将通过分配大约 900 万位数据(略多于 1 兆字节)来存储 2^9000000 这样大的数字并将整个数字存储在那里。
  • 如果您需要大数字,但不需要保留每个最后一位数字的精度,您会更喜欢 cpp_bin_float 后端之类的东西,尽管为此您可能必须定义您的自己的模板,因为预烘焙版本可能不够大。

对于后者,一个潜在的例子:

using namespace boost::multiprecision;
using my_big_float = number<backends::cpp_bin_float<100, backends::digit_base_2, void, boost::int32_t, -9000000, 9000000>, et_off>;
//Defines the number to have 100 bits of precision, an exponent range from negative
//nine million to positive nine million, and uses 32-bit ints for the internal representation
//of the exponent. Allocator is void (because we don't need it) and et_off just turns off 
//expression templates, which we don't need

int main() {
    my_big_float fl = 5;
    fl = pow(fl, my_big_float{900007});
    std::cout << fl << std::endl;
}

7.88302e+629077

我不知道你的用例是什么,但我的猜测是后者比前者更适合你的用例。你必须自己决定是什么情况。