我正在尝试执行一笔非常大的金额。
我使用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
答案 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
重载,因此您可以考虑使用它。