-2

这是我第一次使用 MPIR 库。我必须对大整数进行一些计算。实际上,这些数字最多可以有 2048 位。我必须执行的第一个任务是找到输入的十进制值中的总位数。这需要使用对数。

在 MPIR 库中,我发现这是一个简单的函数,它给出了给定基数中的总位数,这是查找 MPIR 中不可用的对数的替代方法:

size_t mpz_sizeinbase (mpz t op, int base)

返回以给定基数中的位数测量的 op 的大小。base 可以在 2 到 36 之间变化。 op 的符号被忽略,只使用绝对值。结果将是精确的或 1 太大。如果 base 是 2 的幂,则结果总是准确的。如果 op 为零,则返回值始终为 1。此函数可用于确定将 op 转换为字符串时所需的空间。正确的分配量通常比 mpz_sizeinbase 返回的值多两个,一个用于负号,一个用于空终止符。请注意,mpz_sizeinbase(op,2) 可用于定位 op 中的最高有效 1 位,从 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”logicaloperations.cpp 28 1 logicaloperations **

这仅用于测试,在我的实际代码中,我将具有如下值:

mpz_t opt= 111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; 

能否指点一下如何正确使用这个函数的参数?

一个例子就足够了。

4

1 回答 1

1

好吧,我自己能够解决这个问题。将来有人可能会要求这样做,因此我将其发布在这里。

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; 

}

现在我明白了!

如果有人可以进一步改进它,那将有很大帮助

于 2014-12-22T10:58:30.350 回答