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

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

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. Я не знаю так много C#, но я не думаю, что длина должна иметь значение здесь?:S

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum >= 0)
    {
        sum += primes[i];
    }
}
Другие вопросы по тегам