为C ++安装Big Integer库?

时间:2012-04-09 18:02:11

标签: c++

我尝试安装https://mattmccutchen.net/bigint/,即使我包含所有.hh文件,使用BigIntegers也会抛出未定义的引用错误。

[Linker error] undefined reference to `BigInteger::BigInteger(int)'
[Linker error] undefined reference to BigInteger::divideWithRemainder(BigInteger const&, BigInteger&)

我正在使用DevCPP并且不想从此切换(除了DevCPP之外的任何其他工作都很头疼)。我也尝试过GMP,但这种情况不必要地令人困惑,我也无法做到这一点。

当我尝试编译随附的.cc文件时,我得到了所有相同的链接器错误。

1 个答案:

答案 0 :(得分:2)

我不知道DevCPP是如何工作的,但您要做的是从Matt的库中复制.c文件并将它们放在与您的代码(.cpp?)文件相同的文件夹中。然后你必须编译这些文件,就像编译所有代码一样。那应该可以解决这个问题。执行此操作的方法是特定于编译器,但我在此处找到了DevCPP的说明:http://www.uniqueness-template.com/devcpp/您需要创建一个“项目”,然后将代码和代码添加到其中。这就是你如何用超过源文件来编写程序,这对于编写几乎任何程序都是绝对必要的知识。

您提到您的演示测试代码的答案错误,代码是

BigInteger num = 123456789*123456789*123456789; 

这是因为你有整数123456789,并乘以整数123456789(溢出),然后乘以整数123456789(溢出_again),和< em>然后将结果转换为BigInteger。显然,那是不对的。您的代码应该如下所示:

BigInteger first = 123456789; //yes, you can convert from int to BigInteger
BigInteger second = 123456789;
BigInteger third = 123456789;
BigInteger num = first *second *third; 

由于您希望从int64_t转换为BigInteger,因此您必须跳过一个小环,因为BigInteger并未设计为int64_t。所以这是一个转换函数。

BigInteger int64_to_BigInt(int64_t v)
{ return BigInteger(int(v/INT_MAX))*INT_MAX+int(v%INT_MAX);}

int64_t BigInt_to_int64(BigInteger v)
{
    BigInteger bottom;
    v.divideWithRemainder(INT_MAX, bottom);
    return int64_t(v.toInt())*INT_MAX + bottom.toUnsignedInt();
}