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 ++中的所有十进制数字? [关闭]