【问题标题】:Big numbers library in c++ [closed]C ++中的大数字库[关闭]
【发布时间】:2012-10-20 11:45:57
【问题描述】:

我正在做一个需要非常大的数字的项目,最多 100 位数字。我读过java支持大整数(java.Math.BigInteger),我想知道C++中是否有类似的东西。所以,这是我的问题:是否有实现大整数的标准或非标准 c++ 库?

注意:如果没有大整数的标准实现,我想要一个非标准的simple。提前致谢。

【问题讨论】:

  • 您可以通过简单的网络搜索来回答这个问题。例如:mattmccutchen.net/bigint
  • @DavidHeffernan:我不得不说,只要没有重复的 SO 问题,我不介意; SO 问题会随着时间的推移而得到改进,最好的答案可能会上升到顶部。本质上,这个问题更多的是关于过滤可能性(我应该使用什么)而不是找到它们。不是那样的措辞,这是一个稍微懒惰的问题,但至少我们会在 SO 上有一个答案。
  • 这个问题是题外话,因为它要求图书馆。接受的答案只对那些不介意将整个程序置于 GNU 公共许可证下的未来访问者有用。
  • @Kaz 你评论的第二句话没有意义,GMP在LGPL下。
  • 我在这里的实现:codeproject.com/Articles/1117799/…

标签: c++ biginteger


【解决方案1】:

GNU 多精度算术库可以满足您的需求http://gmplib.org/

Gnu MP 是一个 C 库,但它有一个 C++ class Interface,如果你只对大整数感兴趣,你可以只处理 mpz_class。看看下面我从页面C++ Interface General获取的示例

 int main (void)
 {
   mpz_class a, b, c;

   a = 1234;
   b = "-5678";
   c = a+b;
   cout << "sum is " << c << "\n";
   cout << "absolute value is " << abs(c) << "\n";

   return 0;
 }

【讨论】:

  • 我想要一个简单的实现
  • @RondogiannisAristophanes bignum 实现并不简单
  • @RondogiannisAristophanes 简单实现还是简单接口? GMP的界面不是那么简单,但很容易习惯。它功能强大且高效。
  • 不激动。不足以投反对票,但是(1)这个问题被标记为 C++。 GMP 是 C。 (2) 一个好的 C++ 接口将易于使用;例如,加法只是“+”。 (3) 问题要求大整数。 GMP 是各种各样的大人物。
  • @DavidHammen 也许我应该解决 GMP 的特定部分,而不是整个库。关于(1)和(2),GMP v5 有一个 C++ 类接口gmplib.org/manual/C_002b_002b-Class-Interface.html,它也重载了一些操作符。
【解决方案2】:

不幸的是,没有大数字的标准库。您说您正在寻找一个“简单”的库,我所知道的最简单的库是InfInt。它只包含一个头文件。它的用法相当简单。这是一个示例代码:

InfInt myint1 = "15432154865413186646848435184100510168404641560358";
InfInt myint2 = 156341300544608LL;

myint1 *= --myint2 - 3;
std::cout << myint1 << std::endl;

【讨论】:

  • 知道与 gmp 相比有多快吗?
  • 链接已损坏。项目“infint”已移至 Internet 上的另一个位置。
  • @ElefEnt:我都试过了,在我的情况下,GMP 的速度要快几个数量级。 (某项任务需要 63 分钟对 40 秒。)但是,我使用了高度优化的 GMP 的MPIR 端口。
  • InfInt 非常慢! GMP 慢了几个数量级!
  • 你为什么要从这个stackoverflow.com/a/16801910/995714转发?
【解决方案3】:

您说您想要一个简单的界面/实现,这里是http://www.di-mgt.com.au/bigdigits.html。不过,就我个人而言,我仍然会选择 GMP。

【讨论】:

    【解决方案4】:

    您将在 char 数组中输入,然后将其更改为 int 数组。数组的大小也可以改变。

    #include<iostream>
    
    using std::cout;
    using std::cin;
    using std::endl;
    
    int main()
    {
        int b, i, arrayint[100];
        char arraychar[100];
    
        for(i = 0; i < 100; i++)
            cin >> arraychar[i];
    
        for(i = 0; i < 100; i++)
            cout << arraychar[i];
    
        cout << endl;
    
        for(i = 0; i < 100; i++)
            arrayint[i] = arraychar[i] - '0';
    
        for(i = 0; i < 100; i++)
            cout << arrayint[i];
    
        return 0;
    }
    

    【讨论】:

    • 这不是好的 C++ 实践。
    猜你喜欢
    • 2011-06-17
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2012-12-19
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多