一、BigInteger用法C語言
BigInteger是一種可存儲任意精度整數的數據類型,可以避免C語言中默認的整型溢出問題。使用BigInteger需要引入頭文件「#include <gmp.h>」,並使用mpz_t定義BigInteger的數據類型。BigInteger的初始化可以使用mpz_init函數,釋放內存可以使用mpz_clear函數。
#include <gmp.h>
int main(){
mpz_t a;
mpz_init(a);
mpz_set_str(a, "123456789012345678901234567890", 10);
gmp_printf("%Zd\n", a);
mpz_add_ui(a, a, 1);
gmp_printf("%Zd\n", a);
mpz_clear(a);
return 0;
}
上述代碼演示了BigInteger的初始化、賦值和加1操作,其中gmp_printf可以用來列印BigInteger類型的數值。
二、BigInteger用法轉成String
BigInteger可以通過mpz_get_str函數將其轉化為字元串類型,其中第一個參數為目標字元串數組,第二個參數為進位,第三個參數為BigInteger類型變數。同樣地,針對字元串類型數組,也可以使用mpz_set_str函數將其轉化為BigInteger類型。
#include <gmp.h>
#include <stdio.h>
int main(){
mpz_t a;
mpz_init(a);
mpz_set_str(a, "123456789012345678901234567890", 10);
char str[1000];
mpz_get_str(str, 10, a);
printf("%s\n", str);
mpz_clear(a);
return 0;
}
上述代碼演示了BigInteger類型轉化為字元串類型的方法。
三、BigInteger乘加演算法
BigInteger的乘和加操作可以通過mpz_mul和mpz_add函數實現。代碼如下:
#include <gmp.h>
int main(){
mpz_t a, b, c, d;
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_init(d);
mpz_set_str(a, "123456789012345678901234567890", 10);
mpz_set_str(b, "987654321098765432109876543210", 10);
mpz_mul(c, a, b);
mpz_add(d, a, b);
gmp_printf("%Zd\n", c);
gmp_printf("%Zd\n", d);
mpz_clear(a);
mpz_clear(b);
mpz_clear(c);
mpz_clear(d);
return 0;
}
四、BigInteger的加減乘除
BigInteger的加減乘除操作可以使用mpz_add, mpz_sub, mpz_mul和mpz_div函數實現。其中,mpz_div函數得到的是整數部分。代碼如下:
#include <gmp.h>
int main(){
mpz_t a, b, c, d, e, f;
mpz_init(a);
mpz_init(b);
mpz_init(c);
mpz_init(d);
mpz_init(e);
mpz_init(f);
mpz_set_str(a, "123456789012345678901234567890", 10);
mpz_set_str(b, "987654321098765432109876543210", 10);
mpz_add(c, a, b);
mpz_sub(d, a, b);
mpz_mul(e, a, b);
mpz_div(f, a, b);
gmp_printf("%Zd\n", c);
gmp_printf("%Zd\n", d);
gmp_printf("%Zd\n", e);
gmp_printf("%Zd\n", f);
mpz_clear(a);
mpz_clear(b);
mpz_clear(c);
mpz_clear(d);
mpz_clear(e);
mpz_clear(f);
return 0;
}
五、BigInteger範圍
BigInteger的數值範圍是大於等於-2^N到2^N-1的整數,其中N由分配給變數的bit數決定。可以通過mpz_getlimbn和mpz_sizeinbase函數來得到一個BigInteger的有效位數和大小。代碼如下:
#include <gmp.h>
int main(){
mpz_t a;
mpz_init(a);
mpz_set_str(a, "123456789012345678901234567890", 10);
int bit_size = 8*sizeof(mp_limb_t)*mpz_size(a);
int num_bits = mpz_sizeinbase(a,2);
printf("BigInteger的位數是%d,%d\n", bit_size, num_bits);
mpz_clear(a);
return 0;
}
六、BigInteger最大值
BigInteger的最大值可以通過mpz_ui_pow_ui函數得到,其中第一個參數為結果,第二個參數為進位,第三個參數為次方。代碼如下:
#include <gmp.h>
int main(){
mpz_t a;
mpz_init(a);
mpz_ui_pow_ui(a, 2, 8192);
gmp_printf("%Zd\n", a);
mpz_clear(a);
return 0;
}
七、BigInteger轉String
BigInteger類型和字元串類型之間的轉化可以通過mpz_get_str和mpz_set_str來實現,前者是從BigInteger類型轉為字元串類型,後者是從字元串類型轉為BigInteger類型。代碼如下:
#include <gmp.h>
int main(){
mpz_t a;
mpz_init(a);
mpz_set_str(a, "123456789012345678901234567890", 10);
char str[1000];
mpz_get_str(str, 10, a);
printf("%s\n", str);
mpz_set_str(a, str, 10);
mpz_clear(a);
return 0;
}
八、BigInteger比較大小
BigInteger的大小比較可以使用mpz_cmp函數實現,返回值是-1(小於)、0(等於)或1(大於)。代碼如下:
#include <gmp.h>
int main(){
mpz_t a, b;
mpz_init(a);
mpz_init(b);
mpz_set_str(a, "123456789012345678901234567890", 10);
mpz_set_str(b, "987654321098765432109876543210", 10);
int result = mpz_cmp(a, b);
printf("%d\n", result);
mpz_clear(a);
mpz_clear(b);
return 0;
}
以上是BigInteger的常規用法,可以通過這些用法輕鬆處理大數運算。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257981.html
微信掃一掃
支付寶掃一掃