11

我试图在 C++ 变量中放置一个大数字。号码是600851475143

我尝试了 unsigned long long int 但得到一个错误,说它的常数太大了。然后我尝试了一个名为 BigInt 的 bigInt 库 -> http://mattmccutchen.net/bigint/

问题是我无法编译代码,因为我收到了很多关于 lib 的错误。

对“BigInteger::BigInteger(int)”的未定义引用 <-- 其中很多。

到目前为止,这是我的代码:

#include "string"
#include "iostream"       
#include "bigint/NumberlikeArray.hh"
#include "bigint/BigUnsigned.hh"
#include "bigint/BigInteger.hh"
#include "bigint/BigIntegerAlgorithms.hh"
#include "bigint/BigUnsignedInABase.hh"
#include "bigint/BigIntegerUtils.hh"
using namespace std;

int main() {

    //unsigned long int num = 13195;
    //unsigned long long int num = 600851475143;
    BigInteger num = 13195;
    int divider = 2;

    //num = 600851475143;

    while (1) {
        if ((num % divider) == 0) {
            cout << divider << '\n';
            num /= divider;
        }
        else
            divider++;

        if (num == 1)
            break;
    }
}

如果我输入较小的数字并且不使用 BigInt 库,则该程序运行良好。任何帮助将不胜感激:D

4

9 回答 9

23

您可以通过后缀 L
指定整数文字。您可以通过后缀 LL 指定整数文字。

#include <iostream>

int main()
{
    long long num = 600851475143LL;

    std::cout << num;
}
于 2008-10-26T17:50:20.260 回答
13

数字 600851475143 对于 long long int 来说并不算大,但在使用 long long 常量时需要使用 LL 后缀(ULL 表示 unsigned long long int):

unsigned long long int num = 600851475143ULL;
于 2008-10-26T17:53:11.377 回答
3

大型整数库的存在理由是表示您的语言无法原生处理的整数。这意味着,你甚至不能把它写成文字。可能,该库有一种将字符串解析为大数字的方法。

于 2008-10-26T18:00:56.960 回答
2

在更一般的情况下,当您无法长时间容纳您的号码并且可以使用 GNU LGPL 许可证(http://www.gnu.org/copyleft/lesser.html)时,我建议您尝试使用 GNU Multiprecision Library ( http://gmplib.org/ )。

它非常快,用 C 语言编写,并带有一个非常酷的 C++-wrapper-library。

于 2008-10-27T19:00:33.423 回答
1

是否有要链接的 bigint 库或要编译的 bigint.cpp?

于 2008-10-26T17:53:41.343 回答
1

如果您收到 bignum 库的未定义参考错误,您可能没有链接它。在 Unix 上,您必须传递一个选项,例如 -lbigint。如果您使用的是 IDE,则必须找到链接器设置并添加库。

至于数字,如前所述,自然常量默认为 int 类型。您必须使用 LL/ll 来获得 long long。

于 2008-10-26T18:04:49.807 回答
1

在这种情况下,要做的第一件事是找出可以放入 unsigned long long 的最大数字是多少。因为它是 64 位的,所以最大的数字是 2^64-1 = 18446744073709551615,比你的数字大。然后你知道你做错了什么,你看看 Martin York 的答案,看看如何解决它。

于 2008-10-26T19:50:13.183 回答
0

试试这个。基本上你可以拥有自己的自定义类,它使用链表来存储无限大小的数量。(内存是限制)试试这个 https://mattmccutchen.net/bigint/

于 2011-03-08T11:24:34.487 回答
0

对于在提出这个问题五年后遇到这个图书馆问题的任何其他人,这就是你的答案。你不能只编译你的程序,它会无法链接到一个丑陋的难以理解的错误!这个库是你应该编译成 .o 文件并链接的 c++ 文件的集合。如果您查看随示例程序提供的 make 文件的输出,您将看到:

g++ -c -O2 -Wall -Wextra -pedantic BigUnsigned.cc
g++ -c -O2 -Wall -Wextra -pedantic BigInteger.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerAlgorithms.cc
g++ -c -O2 -Wall -Wextra -pedantic BigUnsignedInABase.cc
g++ -c -O2 -Wall -Wextra -pedantic BigIntegerUtils.cc
g++ -c -O2 -Wall -Wextra -pedantic sample.cc
g++ sample.o BigUnsigned.o BigInteger.o BigIntegerAlgorithms.o BigUnsignedInABase.o BigIntegerUtils.o -o sample

替换sample为您的程序的名称,将这些行粘贴到生成文件或脚本中,然后就可以走了。

于 2013-04-08T20:06:49.843 回答