使用GMP变量之前,需要先初始化,使用完毕要释放变量。初始化和释放是通过专门的函数调用完成的。一个变量只需要初始化一次,如果非要多次初始化,在每次初始化操作之间释放变量。初始化后的变量可以进行任意次赋值。
一般在函数的开头初始化变量,函数末尾释放变量;为了效率,应避免过多的变量初始化和释放操作。
整数函数:进行有符号整数运算,对应mpz_t
类型,函数名一律以mpz_
为前缀
1、初始化
void mpz_init(mpz_t x)
初始化x并设其初值为0
void mpz_inits(mpz_t x, ...)
初始化参数列表中的变量,初值设为0. 最后一个参数用NULL,表示结束
void mpz_clear(mpz_t x) 释放变量
void mpz_clears(mpz_t x, ...) 释放变量,最后一个参数用NULL;
2、赋值
void mpz_set(mpz_t x, const mpz_t op)
void mpz_set_q(mpz_t x, const mpq_t op)
void mpz_set_f(mpz_t x, const mpf_t op)
void mpz_set_ui(mpz_t x, const unsigned long op)
void mpz_set_si(mpz_t x, const signed long op)
void mpz_set_d(mpz_t x, const double op)
int mpz_set_str(mpz_t x, const char * s, int base)
把字符串代表的整数值赋值给x,忽略字符串中的空白字符。base的取值范围是 2~62。如果字符串是有效的数字,函数返回0,否则函数返回-1.当base取值为0时,根据字符串的前缀确定基数:0x和0X代表16进制、0代表八进制、0b和0B表示二进制、否则就是十进制;当base <= 36 时,英文字符不区分大小写;当 37 <= base && base <=62 时,大写字母代表10~35
之间的数,小写字母代表61~61;
3、数值计算
void mpz_add(mpz_t rop, mpz_t x, mpz_t y) // x+y ⇒ rop
void mpz_sub(mpz_t rop, mpz_t x, mpz_t y) // x-y ⇒ rop
void mpz_mul(mpz_t rop, mpz_t x, mpz_t y) // x*y ⇒ rop
void mpz_neg(mpz_t rop, mpz_t op) // -op ⇒ rop
void mpz_abs(mpt_t rop, mpz_t op) // |op| ⇒ rop
void mpz_cdiv_q(mpz_t q, mpz_t n, mpz_t d)//求商
void mpz_cdiv_r(mpz_t r, mpz_t n, mpz_t d) //取余
void mpz_cdiv_qr(mpz_t q, mpz_t r, mpz_t n, mpz_t d)//同时计算商和余数
4、代码(求两数和)
#include <stdio.h>
#include <gmp.h>
using namespace std;
int main()
{
mpz_t a,b,c;
mpz_inits(a,b,c,0,NULL);//等价mpz_inits(a);mpz_inits(b);mpz_inits(c);初始化变量为0
gmp_scanf("%Zd%Zd",a,b);
mpz_add(c,a,b);
gmp_printf("c = %Zd",c);
return 0;
}