首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表和太大,引发溢出异常

列表和太大,引发溢出异常
EN

Stack Overflow用户
提问于 2018-10-03 18:01:14
回答 4查看 2.1K关注 0票数 5

我有一张素数的清单,最多可达2000 000。这是一个包含近15万个非常大整数的列表。我要里面所有数字的总和。下面是一个大整数的随机列表,以供演示:

代码语言:javascript
运行
复制
List<int> numbers = new List<int>();
for (int i = 0; i < 100; i++)
{
    numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());

我得到了一个“算术运算导致溢出”异常。我想这个总和太大了,但是把它转换成Int64没有帮助,它仍然抛出相同的异常。

代码语言:javascript
运行
复制
Console.WriteLine(Convert.ToUInt64(numbers.Sum()).ToString());

我甚至尝试将和保存到Int64变量中,然后使用它,但这也不起作用。

代码语言:javascript
运行
复制
long sum = numbers.Sum();
Console.WriteLine(sum.ToString());

是否有任何数据类型可以容纳这么大的数字,或者我是否在其他地方犯了错误?谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-03 18:04:49

问题是你的答案是超过26.5亿美元。将int更改为Int64

代码语言:javascript
运行
复制
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在数万亿美元之内

票数 7
EN

Stack Overflow用户

发布于 2018-10-03 18:02:58

在得到求和之前,尝试转换为Int64 (long):

代码语言:javascript
运行
复制
Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
票数 11
EN

Stack Overflow用户

发布于 2018-10-03 18:06:33

您可以使用Aggregate方法:

代码语言:javascript
运行
复制
Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));

这个过载的Aggregate以累加器作为第一个参数

文字0L将被视为long,而不是int。这将使您免于算术溢出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52633126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档