我'使用Sieve计算所有质数低于200万的总和,但程序因溢出而多次尝试后仍然崩溃。它适用于PRIME_LIMIT = 200000
那我的代码有什么问题?我不认为这是算法问题。当我在声明布尔数组时放置static
关键字时,它会输出错误的总和...没有关键字,它会溢出......
这是我写的方法:
void problem10()
{
unsigned long long int iter = 2, sum = 0;
static bool prime[PRIME_LIMIT];
for (unsigned long long int i = 0; i < PRIME_LIMIT; i++)
{
prime[i] = true;
}
unsigned long long int limit = ceil(sqrt(PRIME_LIMIT));
for (unsigned long long int i = 2; i <= limit; i++)
{
if (prime[i])
{
for (unsigned long long int j = i*i; j < PRIME_LIMIT; j += i)
{
prime[j] = false;
}
}
}
for (unsigned long long int i = 2; i < PRIME_LIMIT; i++)
{
if (prime[i])
{
sum += i;
//printf("Primes are: %d\n", i);
}
}
printf("Sum of prime is: %llu\n", sum);
}
答案 0 :(得分:3)
正如您在评论中所说,您没有包含<math.h>
。然后编译器不知道
sqrt()
和ceil()
函数的声明:
double sqrt(double x);
double ceil(double x);
你可能会收到关于&#34;隐含声明的函数&#34;。
的警告然后编译器假定这些函数返回int
并因此生成
错误的代码,可能导致任何类型的未定义行为。