2

我有这段代码:

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];
}

我已检查以确保我的数组“primes”仅包含正整数,如下所示:

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

但不会打印任何内容。但是,由于某种原因,总和有时会是负数,并且会在我运行第一段代码时打印出来。数组的长度是148933。我对C#了解的不多,但没想到这里长度应该很重要吧?:S

如果有人知道为什么会这样,我将不胜感激任何帮助。

4

3 回答 3

6

数组的长度是 148933。

很可能您的总和超出了 int (-2,147,483,648 到 2,147,483,647)的可能值,这就是您看到负数的原因。

用于long总和计算。但是您可能需要BigInteger来计算总和。

于 2014-07-10T14:00:52.437 回答
0

前 21000 个素数之和为 2 368 647 159(根据 Wolfram Alpha)。此值不适合 32 位有符号整数。它将显示为负数。

前 148933 个素数之和为 142 913 828 922。这可以表示为 64 位整数。

无论您在 32 位数字中计算的总和都是错误的,并且可能是正数或负数,具体取决于幅度。

于 2014-07-10T14:49:57.457 回答
-1
if (primes[i] < 0)
    {
        Console.WriteLine(primes[i]);
    }

这并不能确保数组中只有正数,它只会让您知道何时有负素数。

如果您不想在总和中包含负数,请尝试以下操作:

for (int i = 0; i < primes.GetLength(0); i++)
{
    if (sum >= 0)
    {
        sum += primes[i];
    }
}
于 2014-07-10T14:15:30.890 回答