在C++中使用GMP(一)
在C++中使用gmp
GMP是一个优秀的大数库,大数,顾名思义就是比较大的数,大到什么程度呢?就是大到编程语言的基本类型无法装得下的数,举个例子:
比如计算10的阶乘,我们很容易写出下边的代码:1
2
3
4
5
6
7
8
9
10
11
12
13#include <iostream>
using namespace std;
int main()
{
int res(1),i(1);
for (i=1;i!=10;++i)
{
res*=i;
}
cout<<res<<endl;
return 0;
}
用下边的命令编译并运行:
1 | g++ test.cpp |
程序运行的很好,我们把10改为100:1
2
3
4
5
6
7
8
9
10
11
12
13#include <iostream>
using namespace std;
int main()
{
int res(1),i(1);
for (i=1;i!=100;++i)
{
res*=i;
}
cout<<res<<endl;
return 0;
}
然后用同样的方法运行:1
2
3g++ test.cpp
./a.out
0
我看到了什么!0!?为什么是0?我们想一下100的阶乘有多大?结果是:
933262154439441526816992388562667004907159682643816214685929638952175999932299
608941463976156518286253697920827223758251185210916864000000000000000000000000
问题大了,就算是long long类型的整形范围也就是:
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
还差得远呢!所以为了计算这种大数据,我们需要自己设计各种算法来计算这么大的数据,第一件事当然是存储,怎么存储呢?
用数组,用字串!那又怎么计算呢?自己设计数组与数组的乘法……等等,这是不是有点太麻烦啦?有没有简单点的方法呢?当
然有!当当当……主角出场:我大GMP来也!懒得打字,容我copy一篇简介:
GMP是The GNU MP Bignum Library,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和
浮点数。它本身并没有精度限制,只取决于机器的硬件情况。
哇,果然是好东西。于是我就搜啊搜的,发现很少有C++风格的代码例子,大部分是C的,没办法,只能硬着头皮肯官方文档了
(有人给翻译一下该多好?)。
经过一阵子摸索,终于写出了以下代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <iostream>
#include <gmpxx.h>
using namespace std;
int main()
{
mpz_class res(1);
int i(1);
for (i=1;i!=100;++i)
{
res*=i;
}
cout<<res<<endl;
return 0;
}
1 | g++ test2.cpp -lgmp -lgmpxx |
搞定收工!
Writed by Yafeng