C# C中整数数组的所有值求和期间发生溢出异常#

C# C中整数数组的所有值求和期间发生溢出异常#,c#,arrays,aggregate,overflowexception,C#,Arrays,Aggregate,Overflowexception,嗨,我在解决Hackerrank上的一个非常基本的问题,关于确定整数数组中所有值的最小-最大和。基本上给定一个由5个值组成的数组,如[1,2,3,4,5],最小和为1+2+3+4=10,最大和为2+3+4+5=14。这个问题很简单,但我遇到了一个输入值很大的问题。下面是我的解决方案及其结果 //Input: 256741038 623958417 467905213 714532089 938071625 //Output: 2063136757 2744467344 下面是使用内置的Sum(

嗨,我在解决Hackerrank上的一个非常基本的问题,关于确定整数数组中所有值的最小-最大和。基本上给定一个由5个值组成的数组,如[1,2,3,4,5],最小和为1+2+3+4=10,最大和为2+3+4+5=14。这个问题很简单,但我遇到了一个输入值很大的问题。下面是我的解决方案及其结果

//Input: 256741038 623958417 467905213 714532089 938071625
//Output: 2063136757 2744467344
下面是使用内置的Sum()方法

static void Main(string[] args)
{
    int[] arr = new int[5] {256741038,623958417,467905213,714532089,938071625};
    Array.Sort(arr);
    long arrSum = arr.Sum();  //System.OverflowException: 'Arithmetic operation resulted in an overflow.'
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}
下面是使用聚合扩展方法

static void Main(string[] args)

{
    int[] arr = new int[5] {256741038,623958417,467905213,714532089,938071625};
    Array.Sort(arr);
    long arrSum = arr.Aggregate((total, next) => total + next); // arrSum = -1293758914
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}

Output: -2231830539 -1550499952
如果我使用常规的foreach循环,如下所示:

static void miniMaxSum(int[] arr)
{
    Array.Sort(arr);
    long arrSum = 0;
    foreach (var value in arr)
    {
        arrSum += value;
    }
    long minSum = arrSum - arr[arr.Length - 1];
    long maxSum = arrSum - arr[0];
    Console.WriteLine(minSum + " " + maxSum);
}

The output is correct as expected i.e. 2063136757 2744467344
OverflowException类描述说“算术运算产生的结果超出了该运算返回的数据类型的范围”。但是
arrSum
值在
long
范围内,因此我无法找出问题所在。因此,我不确定我是否遗漏了任何内容或错误地使用了函数,但无法理解这种行为


任何细节都值得赞赏。

其失败的原因是在
int
数组上执行Sum()方法。如果您将int数组的数字转换为long,然后对它们运行求和运算,那么您将得到结果

long arrSum = nums.Sum(x => (long)x);

// or, for readability
long arrSum = nums.Select(x => (long)x).Sum();
这将仅在
long
s上运行求和操作。这样做的话,它会对整数求和,直到对所有整数都求和,然后将其保存到long中。。在执行加法时,它失败了,因为Int32不能太大。

“arrSum值在
长范围内”――您的问题不清楚。
arrSum
变量的类型为
long
,因此它只能是范围内的变量。例外情况是告诉您,
Sum()
方法中的计算导致了一个无法放入
long
中的值。实际上,使用
Aggregate()
产生的负面结果表明您确实超过了最大值,导致存储值变为负值。当然,这是无法验证的,因为您没有费心提供。请改进这个问题。