Положительные целые числа в массиве суммируют с отрицательным числом
У меня есть этот кусок кода:
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];
}
}