GMP mpz_sizeinbase在基数10中返回9的大小为2

时间:2015-09-16 09:22:54

标签: c gmp

我正在尝试使用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

我做错了吗?

2 个答案:

答案 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返回的值多两个,一个额外的一个   减号和一个用于空终止符。

Similar question here worth looking at it

答案 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

但有一点需要注意,对于负数,您可能需要减去一个,因为字符串表示包含-符号。