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

Ale*_*ist 2 c gmp

我正在尝试使用 libgmp,但使用 mpz_sizeinbase 时遇到了一些奇怪的情况。如果我使用以基数 - 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);
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时:

$ gcc -g draft.c -o draft -lgmp && ./draft
90 has length 3 in base 10
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

Grz*_*ski 5

k党的回答已经解释了结果mpz_sizeinbase。但是,如果您想获得以十进制为单位的精确长度,可以将其转换为字符数组:mpz_get_str,然后使用strlenC 标准库 ( <string.h>):

printf(" has exact length %zu in base %d\n",
    strlen(mpz_get_str(NULL, base, n)), base);
Run Code Online (Sandbox Code Playgroud)

输出:

90 has exact length 2 in base 10
Run Code Online (Sandbox Code Playgroud)

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