这是我第一次使用MPIR库。我必须对大整数做一些计算。实际上这些数字最多可以有2048位。我必须实现的第一个任务是找到输入十进制值的总位数。 Thsi要求使用对数。
在MPIR库中,我发现这是一个简单的函数,它给出了给定基数中的总位数,这是找到MPIR中不可用的对数的替代方法:
size_t mpz_sizeinbase (mpz t op, int base)
返回给定基数中的位数测量的op大小。 基数可以从2变化 删除op的符号,只使用绝对值。结果将是 确切的或1太大了。如果base是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'logicaloperations.cpp 27 1 logicaloperations
错误14错误C2664:'__ gmpz_sizeinbase':无法转换参数1 从'int'到 'mpz_srcptr'logicaloperations.cpp 28 1逻辑运算 **
这只是用于测试,在我的实际代码中,我会得到这样的值:
mpz_t opt= 111111111111111111111111111111111111111111111111999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
您能否正确指出如何正确使用此功能的参数?
一个例子就足够了。
答案 0 :(得分: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;
}
现在我明白了!
如果有人能够进一步改进它将会有很大的帮助