使用 boost 库 (cpp_int) 时出现常量太大的错误
Posted
技术标签:
【中文标题】使用 boost 库 (cpp_int) 时出现常量太大的错误【英文标题】:Getting constant too big error while using boost library (cpp_int) 【发布时间】:2020-05-16 16:54:44 【问题描述】:当我尝试使用大整数时,我安装了 boost 库,但是当我尝试调试时,我得到常量太大的错误,而我认为 cpp_int 可以处理它吗? 你能看看我的代码和错误吗? 这是错误:
错误 C2177 常量太大 HW7 C:\Users\hmffa\source\repos\HW7\HW7.cpp 34 Error (active) E0023 integer constant is too large HW7 C:\Users\hmffa\source\repos\HW7\HW7.cpp 34
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using namespace boost::multiprecision;
cpp_int Remainder(cpp_int base, cpp_int exp, cpp_int mod)
cpp_int r = 1;
if (base < 0)
base += mod;
if ((base % mod) == 0)
return r = 0;
if (exp >= mod)
base = base % mod;
exp = exp % (mod - 1);
while (exp > 0)
if (exp % 2 == 1)
r = (r * base) % mod;
exp = exp >> 1;
base = (base * base) % mod;
return r;
int main()
int B[3] = 2,3,5 , C[3] = 0,0,0 ;
cpp_int input = 2, pow = input, exp = 0, powerInput;
cpp_int p= 30903154482632612361920641803533;
int i = 0;
while (i < 3)
exp++;
powerInput = Remainder(input, exp, p);
while (powerInput % B[0] == 0)
C[0]++;
while (powerInput % B[1] == 0)
C[1]++;
while (powerInput % B[2] == 0)
C[2]++;
for (int j = 0; j < 2; j++)
if (C[j] != 0)
cout << C[j] << " ";
cout << endl;
if (C[0] != 0 || C[1] != 0 || C[2] != 0)
i++;
【问题讨论】:
不管库能做什么,30903154482632612361920641803533
永远不会是你的编译器可以处理的常量/数字——它太大了。该库必须提供一些其他方式来初始化大量数字。我不知道 boost 在这里做了什么,但GMP
提供了一些方法来初始化不需要编译器无法处理的常量的数字——我希望 boost 有类似的东西。
【参考方案1】:
改变
cpp_int p= 30903154482632612361920641803533;
到
cpp_int p"30903154482632612361920641803533";
【讨论】:
您应该解释这两行代码之间的区别(调用基于字符串的构造函数)。 @JesperJuhl:您的评论已经说明了这一点;要将您的评论合并到我的答案中吗? @user14717 和 Jesper Juhl 感谢您的友好回复以上是关于使用 boost 库 (cpp_int) 时出现常量太大的错误的主要内容,如果未能解决你的问题,请参考以下文章
用 cpp_int 构建一个大的 boost unordered_map
具有两个 cpp_int 值的 boost::multiprecision::pow
PyBind11:boost::multiprecision::cpp_int 到 Python