ZetCode

C# BigInteger

上次修改时间:2025 年 7 月 5 日

在本文中,我们将展示如何在 C# 中使用 BigInteger 类型 来处理超出内置数据类型限制的极大整数值。本教程涵盖了在 C# 中使用 BigInteger 的基础知识,适用于需要高精度数字计算的开发人员。

BigInteger 表示任意大小的有符号整数。当内置整数类型不足以表示值时,将使用它。 BigInteger 位于 System.Numerics 命名空间中。

溢出

当计算产生的值大于给定数据类型可以存储的值时,会发生算术溢出

Program.cs
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);

为了进行比较,我们打印 intlongUInt64UInt128 类型的最大值。

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 等效项。

Program.cs
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

Program.cs
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 值。

Program.cs
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)

这是该方法的概要。

Program.cs
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 计算两个值的商和余数。

Program.cs
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

来源

BigInteger 结构体 - 语言参考

在本文中,我们使用了 C# 中的 BigInteger。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程