算术运算导致C#

时间:2017-04-17 11:38:09

标签: c#

我正在尝试执行一笔非常大的金额。

我使用ulong数据类型来存储和值。但我一直收到运行时错误。

static void Main(String[] args) {
    int n = Convert.ToInt32(Console.ReadLine());
    string[] arr_temp = Console.ReadLine().Split(' ');
    int[] arr = Array.ConvertAll(arr_temp,Int32.Parse);

    ulong sum = (ulong)arr.Sum();
    Console.WriteLine(sum);

}

输入

1000000001 1000000002 1000000003 1000000004 1000000005

预期输出

5000000015

1 个答案:

答案 0 :(得分:5)

表达式(ulong)arr.Sum()正在调用Enumerable.Sum<int>(),它使用int数据类型执行求和,然后将结果转换为ulong。这意味着结果必须位于int数据类型的域中以避免溢出,但事实并非如此。

您可以通过多种方式解决此问题。也许最简单的方法是在求和之前将数字转换为ulong,但是你必须处理这样一个事实:没有Enumerable.Sum()重载接受ulong

不用担心;我们可以使用Enumerable.Aggregate()自己定义操作:

ulong sum = arr
    .Select(i => (ulong)i)       // Convert elements to ulong
    .Aggregate((a, b) => a + b); // Sum

您也可以将数字解析为ulong而不是int s:

ulong[] arr = Array.ConvertAll(arr_temp, ulong.Parse);

ulong sum = arr.Aggregate((a, b) => a + b);

请注意,Enumerable.Sum()数据类型存在long重载,因此您可以考虑使用它。