C# BigInteger
上次修改时间:2025 年 7 月 5 日
在本文中,我们将展示如何在 C# 中使用 BigInteger 类型 来处理超出内置数据类型限制的极大整数值。本教程涵盖了在 C# 中使用 BigInteger 的基础知识,适用于需要高精度数字计算的开发人员。
BigInteger 表示任意大小的有符号整数。当内置整数类型不足以表示值时,将使用它。 BigInteger 位于 System.Numerics 命名空间中。
溢出
当计算产生的值大于给定数据类型可以存储的值时,会发生算术溢出。
using System.Numerics;
Console.WriteLine(int.MaxValue);
Console.WriteLine(long.MaxValue);
Console.WriteLine(UInt64.MaxValue);
Console.WriteLine(UInt128.MaxValue);
Console.WriteLine("-----------------------");
Console.WriteLine(UInt128.MaxValue + 1);
Console.WriteLine(UInt128.MaxValue + 2);
Console.WriteLine(UInt128.MaxValue + 3);
Console.WriteLine("-----------------------");
Console.WriteLine((BigInteger)UInt128.MaxValue + 1);
Console.WriteLine((BigInteger)UInt128.MaxValue + 2);
Console.WriteLine((BigInteger)UInt128.MaxValue + 3);
在 C# 中,当前最大的内置整数是 UInt128.MaxValue。 如果我们向其添加 1 或更大的值,则计算会溢出。 为了能够处理更大的值,我们需要使用 BigInteger 类型。
Console.WriteLine(int.MaxValue); Console.WriteLine(long.MaxValue); Console.WriteLine(UInt64.MaxValue); Console.WriteLine(UInt128.MaxValue);
为了进行比较,我们打印 int、long、UInt64 和 UInt128 类型的最大值。
Console.WriteLine(UInt128.MaxValue + 1); Console.WriteLine(UInt128.MaxValue + 2); Console.WriteLine(UInt128.MaxValue + 3);
我们将值添加到 UInt128.MaxValue。 结果是算术溢出。
Console.WriteLine((BigInteger)UInt128.MaxValue + 1); Console.WriteLine((BigInteger)UInt128.MaxValue + 2); Console.WriteLine((BigInteger)UInt128.MaxValue + 3);
为了获得正确的结果,我们将第一个操作数强制转换为 BigInteger。
$ dotnet run 2147483647 9223372036854775807 2147483647 9223372036854775807 18446744073709551615 340282366920938463463374607431768211455 ----------------------- 0 1 2 ----------------------- 340282366920938463463374607431768211456 340282366920938463463374607431768211457 340282366920938463463374607431768211458
C# BigInteger.Parse
Parse 方法将数字的字符串表示形式转换为其 BigInteger 等效项。
using System.Numerics;
ulong n = 18446744073709551615;
Console.WriteLine(n);
Console.WriteLine(UInt64.MaxValue);
var bi = BigInteger.Parse("18446744073709551616");
Console.WriteLine(bi);
UInt64.MaxValue,即 18446744073709551615,是 C# 代码中可能的最大整数文字。 为了能够使用更大的数字,必须使用 BigInteger.Parse 从字符串表示形式中解析它。
$ dotnet run 18446744073709551615 18446744073709551615 18446744073709551616
添加 BigInteger
我们可以使用 BigInteger.Add 方法或 + 运算符来添加 BigInteger。
using System.Numerics;
BigInteger n = BigInteger.Parse("12423523432222288811111000");
BigInteger n2 = BigInteger.One;
BigInteger n3 = n + n2 + n2;
Console.WriteLine(n3);
BigInteger n4 = BigInteger.Add(BigInteger.Add(n, n2), n2);
Console.WriteLine(n4);
Console.WriteLine(n3 == n4);
Console.WriteLine(BigInteger.Equals(n3, n4));
在该程序中,我们使用两种方式添加了三个 BigInteger。 我们使用 == 和 BigInteger.Equals 比较结果。
$ dotnet run 12423523432222288811111002 12423523432222288811111002 True True
减去 BigInteger
我们可以使用 BigInteger.Subtract 或 - 运算符减去 BigInteger 值。
using System.Numerics;
BigInteger n = BigInteger.Parse("12423523432222288811111000");
BigInteger n2 = BigInteger.One;
BigInteger n3 = n - n2;
Console.WriteLine(n3);
BigInteger n4 = BigInteger.Subtract(n, n2);
Console.WriteLine(n4);
Console.WriteLine(n3 == n4);
Console.WriteLine(BigInteger.Equals(n3, n4));
该程序使用方法和运算符减去两个值并比较结果。
$ dotnet run 12423523432222288811110999 12423523432222288811110999 True True
BigInteger.Pow
BigInteger.Pow 方法将 BigInteger 值提升为指定值的幂。
BigInteger BigInteger.Pow(BigInteger value, int exponent)
这是该方法的概要。
using System.Numerics;
BigInteger n = BigInteger.Pow(Int64.MaxValue, 2);
Console.WriteLine(n);
BigInteger n2 = BigInteger.Parse("12423523432222288811111000");
BigInteger n3 = BigInteger.Pow(n2, 3);
Console.WriteLine(n3);
该示例使用 BigInteger.Pow 计算两个非常大的值。
$ dotnet run 85070591730234615847396907784232501249 1917495486521555257396734275858546962917892419563859687501415360631000000000
余数
BigInteger.Remainder 对两个 BigInteger 值执行整数除法并返回余数,而 BigInteger.DivRem 计算两个值的商和余数。
using System.Numerics;
BigInteger z1 = BigInteger.Parse("9640282333924329381111174611241768210411");
BigInteger z2 = BigInteger.Parse("340282366920938463463374607431768210428");
BigInteger z3 = BigInteger.Remainder(z1, z2);
Console.WriteLine(z3);
(BigInteger z4, BigInteger z5) = BigInteger.DivRem(z1, z2);
Console.WriteLine(z4);
Console.WriteLine(z5);
Console.WriteLine(z1 == z4 * z2 + z5);
该程序计算两个 BigInteger 值的余数和商。
$ dotnet run 112376060138052404136685603152258318427 28 112376060138052404136685603152258318427 True
来源
在本文中,我们使用了 C# 中的 BigInteger。
作者
列出所有 C# 教程。