列表总和太大,抛出溢出异常
List sum too large, throwing overflow exception
我有一个最多 2 000 000 个素数的列表。该列表包含将近 150 000 个非常大的整数。我想要其中所有数字的总和。这是仅用于演示的随机大整数列表:
List<int> numbers = new List<int>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
我收到 "Arithmetic operation resulted in an overflow" 异常。我猜总和太大了,但是将它转换为 Int64 并没有帮助,它仍然抛出相同的异常。
Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());
我什至尝试将总和保存到 Int64 变量中然后使用它,但这也不起作用。
long sum = numbers.Sum();
Console.WriteLine(sum.ToString());
是否有任何数据类型可以容纳这么大的数字,还是我在其他地方犯了错误?感谢您的帮助。
尝试在求和之前转换为 Int64(长整型):
Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
问题是你的答案超过了 26.5 亿。
将 int
更改为 Int64
List<Int64> numbers = new List<Int64>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
澄清一个Int的最大值大概是26.5亿,Int64是万亿
可以使用Aggregate
方法:
Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));
Aggregate
的重载将累加器作为第一个参数
文字 0L
将被视为 long
,而不是 int
。这将使您免于算术溢出
从 int 到 long 的转换很便宜,有时甚至是免费的。让我们比较五个代码
long sum = intArr.Select(x => (long)x).Sum(); // 0.95s
long sum = intArr.Sum(x => (long)x); // 0.95s
long sum = longArr.Sum(); // 0.86s
long sum = 0;
foreach (int x in intArr)
{
sum += x; // 0.22s
}
long sum = 0;
foreach (long x in longArr)
{
sum += x; // 0.23s
}
经过的时间是针对 100M 个项目。如您所见,如果您关心性能,转换不是问题
我有一个最多 2 000 000 个素数的列表。该列表包含将近 150 000 个非常大的整数。我想要其中所有数字的总和。这是仅用于演示的随机大整数列表:
List<int> numbers = new List<int>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
我收到 "Arithmetic operation resulted in an overflow" 异常。我猜总和太大了,但是将它转换为 Int64 并没有帮助,它仍然抛出相同的异常。
Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());
我什至尝试将总和保存到 Int64 变量中然后使用它,但这也不起作用。
long sum = numbers.Sum();
Console.WriteLine(sum.ToString());
是否有任何数据类型可以容纳这么大的数字,还是我在其他地方犯了错误?感谢您的帮助。
尝试在求和之前转换为 Int64(长整型):
Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
问题是你的答案超过了 26.5 亿。
将 int
更改为 Int64
List<Int64> numbers = new List<Int64>();
for (int i = 0; i < 100; i++)
{
numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());
澄清一个Int的最大值大概是26.5亿,Int64是万亿
可以使用Aggregate
方法:
Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));
Aggregate
的重载将累加器作为第一个参数
文字 0L
将被视为 long
,而不是 int
。这将使您免于算术溢出
从 int 到 long 的转换很便宜,有时甚至是免费的。让我们比较五个代码
long sum = intArr.Select(x => (long)x).Sum(); // 0.95s
long sum = intArr.Sum(x => (long)x); // 0.95s
long sum = longArr.Sum(); // 0.86s
long sum = 0;
foreach (int x in intArr)
{
sum += x; // 0.22s
}
long sum = 0;
foreach (long x in longArr)
{
sum += x; // 0.23s
}
经过的时间是针对 100M 个项目。如您所见,如果您关心性能,转换不是问题