Дополнительные классы и структуры .NET. BigInteger

Все широко известные целочисленные типы данных в .NET имеют свои диапазоны значений, которые мы можем получить, используя свойства MaxValue или MinValue. Неизменяемы тип данных BigInteger представляет собой целое число со знаком, которое, в теории, не имеет верхних и нижних границ. Чтобы воспользоваться этим типом данных, необходимо подключить пространство имен System.Numerics.

Когда могут потребоваться большие числа?

Очевидно, что в 99% случаев вам вряд ли удастся провести какой-либо практически применимый расчёт, чтобы его результат превысил все возможные верхние границы целочисленных типов данных. Например, вряд ли когда либо у человека накопиться на счёту больше 18 446 744 073 709 551 615 (тип ulong) долларов. Однако, если дело касается каких-либо математических расчётов, попыток доказать какую-либо теорему, например для всего множества натуральных чисел и т.д., то, вполне возможно, что наступит момент, когда ваше очередное число не поместиться даже в тип ulong. Ну, или простой пример — попробуйте, используя все известные целочисленные типы рассчитать факториал 100 (100!). Результат такого вычисления — число со 158 знаками. Но на экране вы его не увидите.

Видимо, для подобных ситуаций, в свое время, в .NET появился специальный тип целочисленных значений — BigInteger.

Работа с BigInteger в C#

Создание экземпляра BigInteger

Чтобы создать экземпляр BigInteger мы можем использовать несколько способов.

Использование оператора new

BigInteger big = new(134000);
BigInteger big2 = new(ulong.MaxValue);
BigInteger big3 = new(123456789.777777);

в параметры конструктора мы можем передавать целые числа, числа с плавающей запятой или массив типа byte[]:

byte[] byteArray = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BigInteger big4 = new BigInteger(byteArray);

Присвоение значения переменной типа BigInteger

Второй, более привычный способ — присвоение значения переменной типа BigInteger, например:

BigInteger big3 = 123456;
BigInteger big4 = (BigInteger)123456.7777777;

Чтобы присвоить переменной типа BigInteger значение с плавающей запятой, необходимо использовать явное приведение типов как это показано во втором случае.

Использование методов Parse и TryParse

Также, для создания экземпляра BigInteger мы можем использовать методы Parse и TryParse, которые извлекают число из строки:

string positiveString = "91389681247993671255432112022112134334002222222";
BigInteger posBigInt = 0;
try
{
    posBigInt = BigInteger.Parse(positiveString);
    Console.WriteLine(posBigInt);
}
catch (FormatException)
{
    Console.WriteLine("Невозможно конвертировать втроку '{0}' в значение BigInteger.", positiveString);
}

Использование свойств BigInteger

Также мы можем присвоить переменной значения 0 и 1, используя статические свойства BigInteger:

BigInteger bigNull = BigInteger.Zero;
BigInteger bigOne = BigInteger.One;
Console.WriteLine(bigNull);
Console.WriteLine(bigOne);
0
1

Выполнение операций с BigInteger

C BigInteger мы можем выполнять такие же операции, как и с обычными числами в C# — сложение, умножение, деление и т.д. Для этого в BigInteger присутствуют все необходимые перегруженные операторы.

Кроме этого, в BigInteger реализованы методы, аналогичные математическим методам из Math — возведение в степень, модуль числа и т.д. Ниже представлены основные методы BigInteger для выполнения математических операций:

Abs() Получает абсолютное значение
Add() Складывает два значения и возвращает результат.
Compare() Сравнивает два значения и возвращает целое значение, которое показывает, больше или меньше первое значение по сравнению со вторым или равно ему.
CompareTo() Сравнивает данный экземпляр с другим экземпляром BigInteger и возвращает целое число, которое показывает, является ли значение данного экземпляра меньшим, большим или равным значению указанного объекта.
Divide() Делит одно значение на другое и возвращает результат.
DivRem() Делит одно значение на другое, возвращает результат, а также возвращает остаток в виде параметра вывода.
GreatestCommonDivisor() Находит наибольший общий делитель двух значений.
Log() Возвращает логарифм указанного числа в системе счисления с указанным основанием.
Log10() Возвращает логарифм с основанием 10 указанного числа.
Max() Возвращает наибольшее из двух значений.
Min() Возвращает наименьшее из двух значений.
ModPow() Выполняет модульное деление числа, возведенного в степень другого числа.
Multiply() Возвращает произведение двух значений.
Negate() Меняет знак указанного значения.
Pow() Возводит значение в заданную степень.
Remainder() Выполняет целочисленное деление двух значений и возвращает остаток.
Subtract() Вычитает одно значение из другого и возвращает результат.

Свойства BigInteger

У BigInteger имеется ряд свойств, позволяющих проводить необходимые проверки числа и возвращать новые экземпляры BigInteger:

IsEven Указывает, равно ли значение четному числу.
IsOne Указывает, равно ли значение значению 1.
IsPowerOfTwo Указывает, равно ли значение степени двух.
IsZero Указывает, равно ли значение значению 0.
MinusOne Получает значение, представляющее минус единицу (-1).
One Получает значение, представляющее единицу (1).
Sign Получает число, указывающее знак (минус, плюс или нуль) текущего значение.
Zero Получает значение, представляющее 0 (нуль).

Чему равен факториал 100?

Попробуем воспользоваться структурой BigInteger и рассчитать чему же равен факториал 100:

static BigInteger Factorial(int n)
{ 
    if ((n==0)||(n==1))
        return (BigInteger)n;
    return (BigInteger)n*Factorial(n-1);
}
static void Main(string[] args)
{
    Console.WriteLine(Factorial(100));
}

Результат:

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Итого

Структура BigInteger представляет целочисленное значение неограниченного размера (этот тип данных не имеет границ MaxValue и MinValue). BigInteger содержит методы и свойства, позволяющие проводить основные математические операции с большими числами — возведение в степень, получение логарифма и так далее. Кроме этого, в BigInteger перегружены основные операторы — сложение, вычитание, умножение, деление, которые позволяют выполнять основные математические операции с BigInteger, как и с другими, известными нам, целочисленными типами.

 

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии