一、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-hant/n/257981.html