这是我第一次使用MPIR库。 我必须对大整数进行一些计算。实际上,这些数字最多可以有 2048 位。 我必须实现的第一个任务是找到输入的十进制值中的总位数。 这需要对数的使用。
在 MPIR 库中,我发现这是一个简单的函数,它给出了给定底数中的总数,这是查找 MPIR 中不可用的对数的替代方法:
size_t mpz_sizeinbase (mpz t op, int base)
返回以给定基数中的位数测量的 op 大小。 基数可以从 2 不等 到 36。op 的符号被忽略,只使用绝对值。结果将是 精确或 1 太大。如果基数是 2 的幂,则结果始终是精确的。如果 op 为零,则返回 值始终为 1。 此函数可用于确定将 op 转换为字符串时所需的空间。这 正确的分配量通常比mpz_sizeinbase返回的值多两倍, 一个额外的减号和一个空终止符。 需要注意的是,mpz_sizeinbase(op,2(可用于定位最重要的1位 在 OP 中,从 1 开始计数。(与从 0 开始的按位函数不同,请参阅部分
我正在尝试在我的程序中按如下方式使用此函数:
#include < cstdio>
#include < stdlib.h>
#include < gmpxx.h>
#include < iostream>
#include <mpirxx.h>
#include <math.h>
#include <windows.h>
void main()
{
mpz_t opt;
size_t nob;
opt=200;
nob= mpz_sizeinbase(opt, 10);
cout << nob<<"n";
}
答案应该是3。
但是我在编译过程中收到以下错误:
错误13 错误 C2440:"=":无法从"int"转换为 "mpz_t"逻辑运算.cpp 27 1 逻辑运算
错误14 错误 C2664:"__gmpz_sizeinbase":无法转换参数 1 从"int"到 "mpz_srcptr"逻辑运算.cpp 28 1 逻辑运算 **
这只是为了测试,在我的实际代码中,我将具有这样的值:
mpz_t opt= 111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
你能给出一些如何正确使用这个函数的参数的指示吗?
一个例子就足够了。
我能够自己解决这个问题。将来有人可能会要求这样做,所以我在这里发布它。
int main()
{
mpz_t a, b ;
size_t nob;
mpz_init (a); mpz_init (b); //initialization
mpz_set_str (b, "61754454545545454545454", 10); //large things work in strings in this world
nob = mpz_sizeinbase(b, 2); //find how many bits are there in the binary
cout<<nob<<"n";
return 0;
}
现在我明白了!
如果有人可以进一步改进它,那将有很大帮助