Содержание
Все широко известные целочисленные типы данных в .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, как и с другими, известными нам, целочисленными типами.