我用筛子来计算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);
}
最佳答案
正如你在评论中所说,你没有包括<math.h>
编译器不知道sqrt()
和ceil()
函数的声明:
double sqrt(double x);
double ceil(double x);
你可能会收到“隐式声明函数”的警告。
然后,编译器假设这些函数返回一个
int
,因此将生成可能导致任何未定义行为的错误代码。
关于c - 使用Eratosthenes筛子求素数之和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23035894/