我用筛子来计算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/

10-10 17:54