Содержание
Все широко известные целочисленные типы данных в .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);
1
Выполнение операций с BigInteger
C BigInteger мы можем выполнять такие же операции, как и с обычными числами в C# — сложение, умножение, деление и т.д. Для этого в BigInteger присутствуют все необходимые перегруженные операторы.
Кроме этого, в BigInteger реализованы методы, аналогичные математическим методам из Math — возведение в степень, модуль числа и т.д. Ниже представлены основные методы BigInteger для выполнения математических операций:
Abs() |
Получает абсолютное значение |
Add() |
Складывает два значения и возвращает результат. |
Compare() |
Сравнивает два значения и возвращает целое значение, которое показывает, больше или меньше первое значение по сравнению со вторым или равно ему. |
Compare |
Сравнивает данный экземпляр с другим экземпляром BigInteger и возвращает целое число, которое показывает, является ли значение данного экземпляра меньшим, большим или равным значению указанного объекта. |
Divide() |
Делит одно значение на другое и возвращает результат. |
Div |
Делит одно значение на другое, возвращает результат, а также возвращает остаток в виде параметра вывода. |
Greatest |
Находит наибольший общий делитель двух значений. |
Log() |
Возвращает логарифм указанного числа в системе счисления с указанным основанием. |
Log10() |
Возвращает логарифм с основанием 10 указанного числа. |
Max() |
Возвращает наибольшее из двух значений. |
Min() |
Возвращает наименьшее из двух значений. |
Mod |
Выполняет модульное деление числа, возведенного в степень другого числа. |
Multiply() |
Возвращает произведение двух значений. |
Negate() |
Меняет знак указанного значения. |
Pow() |
Возводит значение в заданную степень. |
Remainder() |
Выполняет целочисленное деление двух значений и возвращает остаток. |
Subtract() |
Вычитает одно значение из другого и возвращает результат. |
Свойства BigInteger
У BigInteger имеется ряд свойств, позволяющих проводить необходимые проверки числа и возвращать новые экземпляры BigInteger:
Is |
Указывает, равно ли значение четному числу. |
Is |
Указывает, равно ли значение значению 1. |
Is |
Указывает, равно ли значение степени двух. |
Is |
Указывает, равно ли значение значению 0. |
Minus |
Получает значение, представляющее минус единицу (-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));
}
Результат:
Итого
Структура BigInteger представляет целочисленное значение неограниченного размера (этот тип данных не имеет границ MaxValue и MinValue). BigInteger содержит методы и свойства, позволяющие проводить основные математические операции с большими числами — возведение в степень, получение логарифма и так далее. Кроме этого, в BigInteger перегружены основные операторы — сложение, вычитание, умножение, деление, которые позволяют выполнять основные математические операции с BigInteger, как и с другими, известными нам, целочисленными типами.