Положительные целые числа в массиве суммируются с отрицательным числом

У меня есть этот кусок кода:

int[] primes = generatePrimes(bound);

int sum = 0;
for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum < 0)
    {
        Console.WriteLine(sum);
    }
    sum += primes[i];
}

Я проверил, чтобы убедиться, что мой массив «простые числа» содержит только положительные целые числа, например:

if (primes[i] < 0)
{
    Console.WriteLine(primes[i]);
}

Но ничего не будет напечатано. Однако по какой-то причине сумма иногда будет отрицательной и будет напечатана при запуске первого фрагмента кода. Длина массива 148933. Я не очень хорошо знаю С#, но я не думал, что здесь длина должна иметь значение? :С

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


person Henrik Støren    schedule 10.07.2014    source источник


Ответы (3)


длина массива 148933.

Скорее всего, ваша сумма превышает возможные значения для int (-2 147 483 648 до 2 147 483 647), поэтому вы видите отрицательные числа.

Используйте long для расчета суммы. Но вам может понадобиться BigInteger посчитать сумму.

person Habib    schedule 10.07.2014

Сумма первых 21000 простых чисел равна 2 368 647 159 (согласно Wolfram Alpha). Это значение не помещается в 32-битное целое число со знаком. Оно будет отображаться как отрицательное число.

Сумма первых 148933 простых чисел равна 142 913 828 922. Это можно представить в виде 64-битного целого числа.

Какая бы сумма вы ни вычислили в 32-битном числе, она будет неправильной и может быть как положительной, так и отрицательной в зависимости от величины.

person david.pfx    schedule 10.07.2014

if (primes[i] < 0)
    {
        Console.WriteLine(primes[i]);
    }

Это не гарантирует, что в массиве есть только положительные числа, оно только позволяет узнать, когда есть отрицательное простое число.

Если вы не хотите включать минусы в сумму, попробуйте следующее:

for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum >= 0)
    {
        sum += primes[i];
    }
}
person nyl2000    schedule 10.07.2014
comment
Это комментарий, а не ответ. Но код в комментарии вставлять сложно, так что пропустите. - person david.pfx; 10.07.2014
comment
Он утверждал, что номера не печатались. Это было сделано для того, чтобы он был уверен, что отрицательных чисел нет, поэтому нет необходимости изменять, какие числа добавляются к сумме. Это изменение не повлияет на выполнение его программы. - person Servy; 10.07.2014
comment
Как указывает Серви, я использовал оператор if только для отладки и чтобы убедиться, что я не сделал ничего плохого, когда помещал целые числа в список. - person Henrik Støren; 11.07.2014