【发布时间】:2018-10-03 18:01:14
【问题描述】:
我有一个最多 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());
我收到“算术运算导致溢出”异常。我猜总和太大了,但是将其转换为 Int64 并没有帮助,它仍然会引发相同的异常。
Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());
我什至尝试将总和保存到 Int64 变量中然后使用它,但这也不起作用。
long sum = numbers.Sum();
Console.WriteLine(sum.ToString());
是否有任何数据类型可以容纳这么大的数字,还是我在其他地方犯了错误?感谢您的帮助。
【问题讨论】:
-
您的号码可能大于
int的容量。我会尝试将其更改为long -
这是一种常见的错误模式。在所有尝试中,您将总和更改为 long,但将 sum 更改为
long并没有帮助,因为这会转换 为时已晚。这会将 final sum 转换为 long,但到那时它已经溢出了! -
我们也将这种模式视为:
int x = whatever; double percentage = x / 100;但x/100是 int,因此这会转换为双精度为时已晚。你想要的是((double)x)/100或x/100.0,这会导致编译器为你插入转换。这个错误有很多变化。
标签: c# .net linq math integer-overflow