Это первый раз, когда я использую библиотеку MPIR. Я должен сделать некоторые расчеты на Bigintegers. На самом деле эти числа могут иметь максимум 2048 бит. Первая задача, которую я должен реализовать, — найти общее количество бит в десятичном значении. Это требует использования логарифма.
В библиотеке MPIR я обнаружил, что это простая функция, которая дает общее количество цифр в данной базе, альтернатива нахождению логарифма, который недоступен в MPIR:
size_t mpz_sizeinbase (mpz t op, int base)
Возвращает размер операции, измеренный в количестве цифр в заданной базе.
база может отличаться от 2
до 36. Знак операции игнорируется, используется только абсолютное значение. Результат будет либо
точный или 1 слишком большой. Если основание является степенью 2, результат всегда точен. Если op равен нулю, возврат
значение всегда 1.
Эта функция может быть использована для определения места, необходимого при преобразовании op в строку.
правильное количество выделения обычно на два больше, чем значение, возвращаемое mpz_sizeinbase,
один дополнительный для знака минус и один для нулевого терминатора.
Следует отметить, что mpz_sizeinbase (op, 2) может использоваться для определения наиболее значимого 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’ logicoperations.cpp 27 1 логические операцииОшибка 14 Ошибка C2664: «__gmpz_sizeinbase»: невозможно преобразовать параметр 1
от int до
‘mpz_srcptr’ logicoperations.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;
}
Теперь я понял!
Если кто-то может улучшить его дальше, это будет очень полезно