使用Eratosthenes筛选查找素数之和

时间:2014-04-12 20:41:42

标签: c algorithm overflow

我'使用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);
    }

1 个答案:

答案 0 :(得分:3)

正如您在评论中所说,您没有包含<math.h>。然后编译器不知道 sqrt()ceil()函数的声明:

double sqrt(double x);
double ceil(double x);

你可能会收到关于&#34;隐含声明的函数&#34;。

的警告

然后编译器假定这些函数返回int并因此生成 错误的代码,可能导致任何类型的未定义行为。