-2

我尝试安装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它附带的文件时,我得到了所有相同的链接器错误。

4

1 回答 1

2

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

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

BigInteger num = 123456789*123456789*123456789; 

这是因为你有整数123456789,乘以整数123456789(溢出),然后乘以整数123456789(再次溢出),然后将该结果转换为BigInteger. 显然,这是不对的。您的代码应该如下所示:

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

由于您想从 转换int64_tBigInteger,因此您必须跳过一个小圈,因为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();
}
于 2012-04-09T18:11:16.413 回答