文章目录
  1. 1. 在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
2
3
g++ test.cpp
./a.out
362880

程序运行的很好,我们把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
3
g++ 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
2
3
g++ test2.cpp  -lgmp -lgmpxx
./a.out
933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000

搞定收工!


Writed by Yafeng

文章目录
  1. 1. 在C++中使用gmp