c - 需要帮助优化算法 - 两百万以下所有质数的总和

标签 c

我正在尝试做一个 Project Euler问题。

我正在寻找小于 2,000,000 的所有素数的总和。

这就是我所拥有的...

int main(int argc, char *argv[]) {


    unsigned long int sum = 0;

    for (unsigned long int i = 0; i < 2000000; i++) {


        if (isPrime(i)) {
            sum += i;
        }
    }

    printf("sum => %lu\n", sum);


}

int isPrime(int num) {

    if (num < 2) {
        return 0;
    }

    for (int i = 2; i < num; ++i) {
        if (num % i == 0) {
            return 0;
        }
    }
    return 1;
}

它需要很长时间才能运行,因此它不满足欧拉问题的一分钟运行时间规则

当我以 10 的限制运行它时,它得到了正确的答案,17 就像问题中一样。

我的猜测是有一些算法可以减少正在完成的工作。问题是,我不知道它是什么。

有人能给我指出正确的方向吗?

谢谢。

最佳答案

i来自 22000000 (或任何上限),一旦你确定 i是质数,然后你知道 {2i, 3i, 4i, ..., ni}不是质数,其中 ni <= 2000000 .

您不需要测试这些数字 — 您知道它们不是质数。

随着您逐步浏览 testNumbers 数组并从此列表中删除数字,您现在知道的数字不是素数,您可以显着减少实际需要测试的数字。

是的,这就是埃拉托色尼筛法。

关于c - 需要帮助优化算法 - 两百万以下所有质数的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4057527/

相关文章:

c - 如何使用 : "\\" or "\"? 分割字符串

C - 在空格处拆分字符串

c - 打印整数时 fprintf 出现段错误

c - 为 union 体只为一名成员分配足够的内存是错误的吗?

c - 使用指针在数组中存储字符

python - PyOpenCL 2D 数组内核 get_global_id(1) 错误

c++ - 如何通过代理服务器环境获取非标准服务?

不能用 GCC 包含文件

c - 在 C 中解析代码会带来额外的字符

c - 矩阵分配的段错误错误