C ++中的大数字库[关闭]

Posted

技术标签:

【中文标题】C ++中的大数字库[关闭]【英文标题】:Big numbers library in c++ [closed] 【发布时间】: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/… 【参考方案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 慢了几个数量级! 你为什么要从这个***.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++ 实践。

以上是关于C ++中的大数字库[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Win/Linux 上使用 C/C++ 为大页面分配内存的最简单方法是啥? [关闭]

如何设置数字格式以显示C ++中的所有十进制数字? [关闭]

C 中的这段代码决定一个数字是不是是素数,它会因大数而崩溃。为啥?

C 语言中的数字频率问题,无法为大输入获得正确的频率

在C中将大十进制输入转换为256位数组中的十六进制输出

在c ++中使用向量对数字进行排序[关闭]