我正在尝试使用libgmp,我使用mpz_sizeinbase遇到了一些奇怪的事情。如果我使用以base开头的数字 - 1大小太大了。
#include <gmp.h>
mpz_t n;
int main() {
unsigned int base = 10;
mpz_init_set_str (n, "90", base);
mpz_out_str(stdout, base, n);
printf(" has length %zu in base %d\n", mpz_sizeinbase (n, base), base);
}
我跑的时候:
$ gcc -g draft.c -o draft -lgmp && ./draft
90 has length 3 in base 10
我做错了吗?
答案 0 :(得分:4)
注意最后一句话。
正确的分配量通常比mpz_sizeinbase返回的值多两个,一个额外用于减号,一个用于空终止符。
size_t mpz_sizeinbase(mpz_t op,int base)
返回给定基数中的位数测量的op大小。 base可以在2到62之间变化。操作的符号被忽略,只是 使用绝对值。结果将是精确的或1太大。 如果base是2的幂,则结果总是精确的。如果op为零 返回值始终为1。
此功能可用于确定所需的空间 将op转换为字符串。适当的分配通常是 比mpz_sizeinbase返回的值多两个,一个额外的一个 减号和一个用于空终止符。
答案 1 :(得分:3)
kkk's answer已经解释了mpz_sizeinbase
的结果。但是,如果要获得十进制基数的精确长度,可以使用mpz_get_str
将其转换为字符数组,然后使用C标准库(strlen
)中的<string.h>
:
printf(" has exact length %zu in base %d\n",
strlen(mpz_get_str(NULL, base, n)), base);
输出:
90 has exact length 2 in base 10
但有一点需要注意,对于负数,您可能需要减去一个,因为字符串表示包含-
符号。