首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助优化算法-2百万以下所有素数之和

需要帮助优化算法-2百万以下所有素数之和
EN

Stack Overflow用户
提问于 2010-10-30 06:23:23
回答 8查看 7.6K关注 0票数 5

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

我在找2,000,000以下的所有素数之和。

这就是我拥有的..。

代码语言:javascript
复制
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;
}

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

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

我猜想有一些算法可以减少正在做的工作。问题是,我不知道这是什么。

谁能帮我指出正确的方向吗?

谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-10-30 06:31:08

使用i22000000 (或任何上限),一旦确定i是素数,您就知道{2i, 3i, 4i, ..., ni}不是素数,其中ni <= 2000000

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

当您通过testNumbers数组并从这个列表中删除数字时,您现在知道的数字并不是素数,您将显著减少实际需要测试的数字。

是的,这是埃拉托斯提尼的筛子。

票数 8
EN

Stack Overflow用户

发布于 2010-10-30 06:28:50

你可以缩短你寻找素数的时间。有无数种方法可以做到。我认为你不需要在num之前进行测试,但是只需要对sqrt(num)进行测试,但是这只会对你(实际的素数)有一点帮助。

有统计方法可以检查质数是否实际上是素数,它速度更快,只能在2^alot中出错一次.

找到质数最快的方法是印度的一位研究人员,但我找不到联系。

你也可以在这里看到:

维基

票数 2
EN

Stack Overflow用户

发布于 2010-10-30 06:42:24

您可以通过传递到目前为止发现的素数数组来加快isPrime(int num)函数的速度,并检查num是否是这些素数的倍数。另外,您不需要循环到num,只需要循环到sqrt(num)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4057527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档