我有这段代码:
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];
}
我已经检查过以确保我的数组&#34;素数&#34;只包含正整数:
if (primes[i] < 0)
{
Console.WriteLine(primes[i]);
}
但什么都不打印。但是,由于某种原因,总和有时会是负数,并且在我运行第一段代码时会打印出来。阵列的长度是148933.我不太了解C#,但我认为长度在这里不重要? :S
如果有人知道为什么会这样,我会非常感谢任何帮助。
答案 0 :(得分:6)
数组的长度是148933。
很可能你的总和超过了int ( - 2,147,483,648到2,147,483,647)的可能值,这就是你看到负数的原因。
使用long
进行总和计算。但您可能需要BigInteger来计算总和。
答案 1 :(得分:0)
前21000个素数的总和是2 368 647 159(根据Wolfram Alpha)。该值不适合32位有符号整数。它将显示为负数。
前148933个素数的总和是142 913 828 922.这可以表示为64位整数。
无论你在32位数字中计算的总和是错误的,根据幅度可能是正数还是负数。
答案 2 :(得分:-1)
if (primes[i] < 0)
{
Console.WriteLine(primes[i]);
}
这不能确保数组中只有正数,它只会让你知道何时有一个负数。
如果您不想在总和中包含底片,请尝试以下操作:
for (int i = 0; i < primes.GetLength(0); i++)
{
if (sum >= 0)
{
sum += primes[i];
}
}