我正在尝试使用 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)
难道我做错了什么?
三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)
但有一点需要注意,对于负数,您可能需要减一,因为字符串表示形式包含-符号。