Сумма списка слишком велика, исключение переполнения - PullRequest
0 голосов
/ 03 октября 2018

У меня есть список простых чисел до 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());

Есть ли какой-либо тип данных, который может содержать это большое число, или я делаю ошибку где-то еще?Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Проблема в том, что ваш ответ превышает 2,65 миллиарда.Измените int на Int64

List<Int64> numbers = new List<Int64>();
for (int i = 0; i < 100; i++)
{
    numbers.Add(1000000000);
}
Console.WriteLine(numbers.Sum().ToString());

Для уточнения Int имеет максимальное значение примерно 2,65 млрд., А Int64 - в триллионах

0 голосов
/ 03 октября 2018

Вы можете использовать Aggregate метод:

Console.WriteLine(numbers.Aggregate(0L, (c, n) => c + n));

Эта перегрузка Aggregate принимает аккумулятор в качестве первого аргументаЛитерал 0L будет рассматриваться как long, а не int.Это избавит вас от арифметического переполнения

0 голосов
/ 03 октября 2018

Попробуйте преобразовать в Int64 (long) перед получением суммы:

Console.WriteLine(numbers.Select(x=> (long)x).Sum().ToString());
...